%%% $Id: matrix.oz,v 1.0 2002/08/19 16:22:00 dada Exp $
%%% http://dada.perl.it/shootout/
%%%
%%% contributed by Isaac Gouy
%% Usage: start from command line with
%% ozc -x matrix.oz -o matrix.oz.exe
%% matrix.oz.exe 300
functor
import System Application
define
proc {MakeMatrix Rows Cols M}
local Count in
{NewArray 0 Rows-1 0 M}
Count ={NewCell 0}
for I in 0..Rows-1 do
local R in
{NewArray 0 Cols-1 0 R}
{Put M I R}
for J in 0..Cols-1 do
{Assign Count {Access Count}+1}
{Put R J {Access Count}}
end
end
end
end
end
proc {MMult M1 M2 MM}
local S1 N1 Prod S2 N2 in
S1 = {Array.low M1}
N1 = {Array.high M1}
S2 = {Array.low {Get M1 S1}}
N2 = {Array.high {Get M1 S1}}
Prod = {NewCell 0}
{NewArray S1 N1 0 MM}
for I in S1..N1 do
local R in
{NewArray S1 N1 0 R}
{Put MM I R}
for J in S1..N1 do
{Assign Prod 0}
for K in S2..N2 do
{Assign Prod {Get {Get M1 I} K}*
{Get {Get M2 K} J}+{Access Prod}}
end
{Put R J {Access Prod}}
end
end
end
end
end
proc {RepeatMMult N M1 M2 MM}
local T in
if N > 1 then
{MMult M1 M2 T}
{RepeatMMult N-1 M1 M2 MM}
else {MMult M1 M2 T} MM = T end
end
end
in
local Args Repeat N M1 M2 MM in
[Args] = {Application.getArgs plain}
Repeat = {String.toInt Args}
N = 30
{MakeMatrix N N M1}
{MakeMatrix N N M2}
{RepeatMMult Repeat M1 M2 MM}
{System.printInfo {Get {Get MM 0} 0}}{System.printInfo ' '}
{System.printInfo {Get {Get MM 2} 3}}{System.printInfo ' '} % get col 3 out of row 2
{System.printInfo {Get {Get MM 3} 2}}{System.printInfo ' '} % get col 2 out of row 3
{System.showInfo {Get {Get MM 4} 4} }
end
{Application.exit 0}
end