home *** CD-ROM | disk | FTP | other *** search
- ############################################################################
- #
- # File: matrix.icn
- #
- # Subject: Procedures for matrix manipulation
- #
- # Author: Stephen B. Wampler and Ralph E. Griswold
- #
- # Date: April 19, 1992
- #
- ###########################################################################
-
- procedure write_matrix(M)
- local r, c, row, col
-
- r := *M
- c := *M[1]
-
- writes("[")
- every row := 1 to r do {
- writes("[")
- every col := 1 to c do {
- writes(right(M[row][col], 8), ", ")
- }
- write("]")
- }
- write("]")
-
- end
-
- procedure create_matrix(n, m, x)
- local M
-
- M := list(n)
- every !M := list(m, x)
-
- return M
-
- end
-
- procedure identity_matrix(n, m)
- local r, c
-
- M := create_matrix(n, m, 0)
-
- every r := 1 to n do {
- every c := 1 to m do {
- if r = c then M[r][c] := 1
- }
- }
-
- return M
-
- end
-
- procedure add_matrix(M1, M2)
- local M3, r, c, n, m
-
- if (n := *M1 ~= *M2) | (m := *M1[1] ~= *M2[1]) then
- stop("*** incorrect matrix sizes")
-
- M3 := create_matrix(n, m)
-
- every r := 1 to n do
- every c := 1 to m do
- M3[r][c] := M1[r][c] + M2[r][c]
-
- return M3
-
- end
-
- procedure mult_matrix(M1, M2)
- local M3, r, c, n
-
- if (n := *M1[1]) ~= *M2 then stop("*** incorrect matrix sizes")
-
- M3 := create_matrix(*M1,*M2[1])
- every r := 1 to *M1 do {
- every c := 1 to *M2[1] do {
- M3[r][c] := 0
- every k := 1 to n do {
- M3[r][c] +:= M1[r][k] * M2[k][c]
- }
- }
- }
-
- return M3
-
- end
-