Matrix multiplication: Difference between revisions
Content added Content deleted
(Add Jsish) |
(Solved task for language AWK) |
||
Line 630: | Line 630: | ||
39 54 69</pre> |
39 54 69</pre> |
||
=={{header|AWK}}== |
|||
<lang 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 |
|||
} |
|||
</lang> |
|||
<p><b>Input:</b></p> |
|||
<pre> |
|||
6.5 2 3 |
|||
4.5 1 5 |
|||
10 16 23 50 |
|||
12 -8 16 -4 |
|||
70 60 -1 -2 |
|||
</pre> |
|||
{{out}} |
|||
<pre> |
|||
299. 268. 178.5 311. |
|||
407. 364. 114.5 211. |
|||
</pre> |
|||
=={{header|BASIC}}== |
=={{header|BASIC}}== |