Matrix multiplication: Difference between revisions

Content added Content deleted
(adding maxima)
(→‎{{header|TI-89 BASIC}}: added UNIX shell code (bash))
Line 2,412: Line 2,412:


<lang ti89b>[[9,12,15][19,26,33][29,40,51][39,54,69]]</lang>
<lang ti89b>[[9,12,15][19,26,33][29,40,51][39,54,69]]</lang>

=={{header|UNIX Shell}}==
<lang bash>
#!/bin/bash

DELAY=0 # increase this if printing of matrices should be slower

echo "This script takes two matrices, henceforth called A and B,
and returns their product, AB.

For the time being, matrices can have integer components only.

"

read -p "Number of rows of matrix A: " arows
read -p "Number of columns of matrix A: " acols
brows="$acols"
echo
echo "Number of rows of matrix B: "$brows
read -p "Number of columns of matrix B: " bcols

crows="$arows"
ccols="$bcols"
echo

echo "Number of rows of matrix AB: " $crows
echo "Number of columns of matrix AB: " $ccols
echo
echo

matrixa=( )
matrixb=( )

# input matrix A

maxlengtha=0
for ((row=1; row<=arows; row++)); do
for ((col=1; col<=acols; col++)); do
checkentry="false"
while [ "$checkentry" != "true" ]; do
read -p "Enter component A[$row, $col]: " number
index=$(((row-1)*acols+col))
matrixa[$index]="$number"
[ "${matrixa[$index]}" -eq "$number" ] && checkentry="true"
echo
done
entry="${matrixa[$index]}"
[ "${#entry}" -gt "$maxlengtha" ] && maxlengtha="${#entry}"
done
echo
done

# print matrix A to guard against errors

if [ "$maxlengtha" -le "5" ]; then
width=8
else
width=$((maxlengtha + 3))
fi

echo "This is matrix A:

"

for ((row=1; row<=arows; row++)); do
for ((col=1; col<=acols; col++)); do

index=$(((row-1)*acols+col))
printf "%${width}d" "${matrixa[$index]}"
sleep "$DELAY"

done
echo; echo # printf %s "\n\n" does not work...
done

echo
echo

# input matrix B

maxlengthb=0
for ((row=1; row<=brows; row++)); do
for ((col=1; col<=bcols; col++)); do
checkentry="false"
while [ "$checkentry" != "true" ]; do
read -p "Enter component B[$row, $col]: " number
index=$(((row-1)*bcols+col))
matrixb[$index]="$number"
[ "${matrixb[$index]}" -eq "$number" ] && checkentry="true"
echo
done
entry="${matrixb[$index]}"
[ "${#entry}" -gt "$maxlengthb" ] && maxlengthb="${#entry}"
done
echo
done

# print matrix B to guard against errors

if [ "$maxlengthb" -le "5" ]; then
width=8
else
width=$((maxlengthb + 3))
fi

echo "This is matrix B:

"

for ((row=1; row<=brows; row++)); do
for ((col=1; col<=bcols; col++)); do

index=$(((row-1)*bcols+col))
printf "%${width}d" "${matrixb[$index]}"
sleep "$DELAY"

done
echo; echo # printf %s "\n\n" does not work...
done

read -p "Hit enter to continue"

# calculate matrix C := AB

maxlengthc=0
time for ((row=1; row<=crows; row++)); do
for ((col=1; col<=ccols; col++)); do
# calculate component C[$row, $col]

runningtotal=0
for ((j=1; j<=acols; j++)); do
rowa="$row"
cola="$j"
indexa=$(((rowa-1)*acols+cola))
rowb="$j"
colb="$col"
indexb=$(((rowb-1)*bcols+colb))
entry_from_A=${matrixa[$indexa]}
entry_from_B=${matrixb[$indexb]}

subtotal=$((entry_from_A * entry_from_B))
((runningtotal+=subtotal))
done
number="$runningtotal"

# store component in the result array
index=$(((row-1)*ccols+col))
matrixc[$index]="$number"

entry="${matrixc[$index]}"
[ "${#entry}" -gt "$maxlengthc" ] && maxlengthc="${#entry}"
done
done

echo
read -p "Hit enter to continue"
echo

# print the matrix C

if [ "$maxlengthc" -le "5" ]; then
width=8
else
width=$((maxlengthc + 3))
fi

echo "The product matrix is:

"

for ((row=1; row<=crows; row++)); do
for ((col=1; col<=ccols; col++)); do

index=$(((row-1)*ccols+col))
printf "%${width}d" "${matrixc[$index]}"
sleep "$DELAY"

done
echo; echo # printf %s "\n\n" does not work...
done

echo
echo
</lang>


=={{header|Ursala}}==
=={{header|Ursala}}==