Siehe auch Fortran-Implementierung.
scilab Code
- function C=strassen(A,B)
- // Groesse der Matrix bestimmen
- dimA=size(A);
- dimB=size(B);
- if(dimA==dimB & dimA(1)<16) then
- C=A*B;
- return;
- end
- // Ueberpruefen, ob die Matrix quadratisch ist
- if(dimA==dimB & dimA(1)==dimA(2)) then
- e=log2(dimA(1));
- n=2^ceil(e);
- // Matrix mit Nullen auffuellen, wenn
- // die Dimensionsbedingung nicht erfuellt ist
- if(e ~= int(e)) then
- col=zeros(dimA(1),n-dimA(1));
- row=zeros(n-dimA(1),n);
- A=[A,col;row];
- B=[B,col;row];
- end
- A11=A(1:n/2,1:n/2);
- A12=A(1:n/2,n/2+1:n);
- A21=A(n/2+1:n,1:n/2);
- A22=A(n/2+1:n,n/2+1:n);
- B11=B(1:n/2,1:n/2);
- B12=B(1:n/2,n/2+1:n);
- B21=B(n/2+1:n,1:n/2);
- B22=B(n/2+1:n,n/2+1:n);
- M1=strassen((A11+A22),(B11+B22));
- M2=strassen((A21+A22),B11);
- M3=strassen(A11,(B12-B22));
- M4=strassen(A22,(B21-B11));
- M5=strassen((A11+A12),B22);
- M6=strassen((A21-A11),(B11+B12));
- M7=strassen((A12-A22),(B21+B22));
- C=[(M1+M4-M5+M7),(M3+M5);(M2+M4),(M1-M2+M3+M6)];
- elseif dimA(2)==dimB(1) then
- C=A*B;
- elseif dimA(1)==dimB(2) then
- C=B*A;
- end
- endfunction
- A=input(" Matrix A eingeben: ");
- B=input(" Matrix B eingeben: ");
- C=strassen(A,B)