Mercurial > matrix-functions
diff matrixcomp/strassenw.m @ 0:8f23314345f4 draft
Create local repository for matrix toolboxes. Step #0 done.
author | Antonio Pino Robles <data.script93@gmail.com> |
---|---|
date | Wed, 06 May 2015 14:56:53 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/matrixcomp/strassenw.m Wed May 06 14:56:53 2015 +0200 @@ -0,0 +1,50 @@ +function C = strassenw(A, B, nmin) +%STRASSENW Strassen's fast matrix multiplication algorithm (Winograd variant). +% C = STRASSENW(A, B, NMIN), where A and B are matrices of dimension +% a power of 2, computes the product C = A*B. +% Winograd's variant of Strassen's algorithm is +% used recursively until dimension <= NMIN is reached, +% at which point standard multiplication is used. +% The default is NMIN = 8 (which minimizes the total number of +% operations). + +% Reference: +% N. J. Higham, Accuracy and Stability of Numerical Algorithms, +% Second edition, Society for Industrial and Applied Mathematics, +% Philadelphia, PA, 2002; chap. 23. + +if nargin < 3, nmin = 8; end + +n = length(A); +if n ~= 2^( log2(n) ) + error('The matrix dimension must be a power of 2.') +end + +if n <= nmin + C = A*B; +else + m = n/2; i = 1:m; j = m+1:n; + + S1 = A(j,i) + A(j,j); + S2 = S1 - A(i,i); + S3 = A(i,i) - A(j,i); + S4 = A(i,j) - S2; + S5 = B(i,j) - B(i,i); + S6 = B(j,j) - S5; + S7 = B(j,j) - B(i,j); + S8 = S6 - B(j,i); + + M1 = strassenw( S2, S6, nmin); + M2 = strassenw( A(i,i), B(i,i), nmin); + M3 = strassenw( A(i,j), B(j,i), nmin); + M4 = strassenw( S3, S7, nmin); + M5 = strassenw( S1, S5, nmin); + M6 = strassenw( S4, B(j,j), nmin); + M7 = strassenw( A(j,j), S8, nmin); + + T1 = M1 + M2; + T2 = T1 + M4; + + C = [ M2+M3 T1+M5+M6; T2-M7 T2+M5 ]; + +end