55 lines
1.3 KiB
Awk
55 lines
1.3 KiB
Awk
# Usage: GAWK -f MATRIX_MULTIPLICATION.AWK filename
|
|
# Separate matrices a and b by a blank line
|
|
BEGIN {
|
|
ranka1 = 0; ranka2 = 0
|
|
rankb1 = 0; rankb2 = 0
|
|
matrix = 1 # Indicate first (1) or second (2) matrix
|
|
i = 0
|
|
}
|
|
NF == 0 {
|
|
if (++matrix > 2) {
|
|
printf("Warning: Ignoring data below line %d.\n", NR)
|
|
}
|
|
i = 0
|
|
next
|
|
}
|
|
{
|
|
# Store first matrix in a, second matrix in b
|
|
if (matrix == 1) {
|
|
ranka1 = ++i
|
|
ranka2 = max(ranka2, NF)
|
|
for (j = 1; j <= NF; j++)
|
|
a[i,j] = $j
|
|
}
|
|
if (matrix == 2) {
|
|
rankb1 = ++i
|
|
rankb2 = max(rankb2, NF)
|
|
for (j = 1; j <= NF; j++)
|
|
b[i,j] = $j
|
|
}
|
|
}
|
|
END {
|
|
# Check ranks of a and b
|
|
if ((ranka1 < 1) || (ranka2 < 1) || (rankb1 < 1) || (rankb2 < 1) ||
|
|
(ranka2 != rankb1)) {
|
|
printf("Error: Incompatible ranks (%dx%d)*(%dx%d).\n", ranka1, ranka2, rankb1, rankb2)
|
|
exit
|
|
}
|
|
# Multiplication c = a * b
|
|
for (i = 1; i <= ranka1; i++) {
|
|
for (j = 1; j <= rankb2; j++) {
|
|
c[i,j] = 0
|
|
for (k = 1; k <= ranka2; k++)
|
|
c[i,j] += a[i,k] * b[k,j]
|
|
}
|
|
}
|
|
# Print matrix c
|
|
for (i = 1; i <= ranka1; i++) {
|
|
for (j = 1; j <= rankb2; j++)
|
|
printf("%g%s", c[i,j], j < rankb2 ? " " : "\n")
|
|
}
|
|
}
|
|
function max(m, n) {
|
|
return m > n ? m : n
|
|
}
|