Last active
August 24, 2016 06:38
-
-
Save wuthmone/89ca975eb8a622cbf92c19fb5fb195fb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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." | |
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 | |
# 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 | |
# 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 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment