// Matrix-matrix multiply for Iota+ uses io.print, io.printi, conv.stoi, conv.itos // A is m-by-n, B is n-by-p, result is m-by-p // Arrays are stored as arrays of rows, i.e., A is an array of m n-vectors. mmm(A: array[array[int]], B: array[array[int]]): array[array[int]] = ( i, j, k: int; m: int = length(A); n: int = length(B); if (m <= 0) return null; if (n <= 0) return null; p: int = length(B[0]); // Check that A is the correct size. i = 0; while (i < m) ( if (n != length(A[i])) return null; i++ ); // Check that B is the correct size. while (i < n) ( if (p != length(B[i])) return null; i++ ); // Allocate a new array. C: array[array[int]] = new array[int][m](new int[p](0)); // MMM i = 0; while (i < m) ( j = 0; while (j < n) ( k = 0; while (k < p) ( C[i][k] = C[i][k] + A[i][j] * B[j][k]; k++ ); j++ ); i++ ); C ) main(args: array[string]): int = ( if (length args < 3) ( print("Usage: mmm <m> <n> <p>\n"); return 1; ) m: int = stoi(args[0], 1); n: int = stoi(args[1], 1); p: int = stoi(args[2], 1); A: array[array[int]] = new array[int][m](new int[n](0)); B: array[array[int]] = new array[int][n](new int[p](0)); i, j: int; i = 0; while (i < m & i < n) ( A[i][i] = 1; i++ ); i = 0; while (i < n) ( j = 0; while (j < p) ( B[i][j] = i * j; j++ ); i++ ); C: array[array[int]] = mmm(A, B); print("A:\N"); printMatrix(A); print("B:\N"); printMatrix(B); print("C:\N"); printMatrix(C); 0 ) printMatrix(M:array[array[int]]) = ( i:int = 0; while (i < length M) ( j:int = 0; print("\t"); while (j < length M[i]) ( print(itos(M[i][j]) + " "); j++ ); print("\N"); i++ ); )