Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
183
Task/Matrix-multiplication/UNIX-Shell/matrix-multiplication.sh
Normal file
183
Task/Matrix-multiplication/UNIX-Shell/matrix-multiplication.sh
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
#!/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
|
||||
Loading…
Add table
Add a link
Reference in a new issue