Sie sind hier: Numerik > Numerik der linearen Algebra > Strassen Matrixmultiplikation (Scilab)

Strassen Matrixmultiplikation (Scilab)

Donnerstag 16. November 2006 von
Simon Praetorius
Implementierung des Algorithmus von Volker Strassen zur Multiplikation von Matrizen, wie im Fortran-Artikel zu diesem Algorithmus beschrieben.
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)
Besucher: 8549 | Permalink | Kategorie: Numerik
Tags: , , , ,

Kommentar hinzufügen

Dieses Feld bitten nicht ausfüllen: