2012-11-22 25 views

回答

4

你最大的问题不是循环。对于这么小的称为MATLAB A*B的矩阵引入了很多开销。你能做的最好的事情是所有的矩阵存储在一个大4 x n_matrices矩阵和手工拼出的矩阵乘法:

A = rand(4, 1000); 
B = rand(4, 1000); 

tic; 
C = zeros(size(A)); 
C(1,:) = A(1,:).*B(1,:) + A(3,:).*B(2,:); 
C(2,:) = A(2,:).*B(1,:) + A(4,:).*B(2,:); 
C(3,:) = A(1,:).*B(3,:) + A(3,:).*B(4,:); 
C(4,:) = A(2,:).*B(3,:) + A(4,:).*B(4,:); 
toc 

Elapsed time is 0.020950 seconds. 

正如你看到的,这需要一点时间(这是一个6岁的台式PC )。对于这样的小矩阵来说,这是实用的,我无法想象用MATLAB编写的其他任何东西都可以打败这种性能。那么,对于非常大数量的2x2矩阵,您可以引入阻塞(即,一次只处理大量矩阵)以增强缓存重用。

+0

我正要写出乘法运算。感谢您拯救我的工作:) – Jonas

+0

@Jonas我的荣幸;) – angainor

+0

感谢您的回答。你指出了一个我并未真正意识到的重要问题。 – TriSSSe

0

我要说的是,这里的循环并不坏,而不是慢,考虑这个

N = 1000000 
S = cell(1,N); 
Out = S; 
A = rand(2); 
B = rand(2); 

for i = 1 : N  
    S{i} = rand(2); 
end 

tic 
for i = 1 : N 
    Out{i} = A * S{i} * B;  
end 
toc 

tic 
    f = @(i) A*i*B; 
    Out = cellfun(f,S,'UniformOutput' , false); 
toc 


    N = 

1000000 

    Elapsed time is 2.609569 seconds. 
    Elapsed time is 9.871200 seconds. 

你可能会认为在执行您的2x2矩阵的cat,然后仅执行2次乘法(移调上正确的方式)。但你会在cat ting的时间里失去时间。

+0

谢谢您的回答! – TriSSSe