1

我有很多 2×2 矩阵 S1、S2、...、SN,并且在每个矩阵上,我想像 R*S*R^T 一样执行左右矩阵乘法,其中 R也是一个 2×2 矩阵。显然我可以用一个 for 循环来写这个,但我预计它对于 MATLAB 中的大 N 来说会非常慢。有没有一种简单有效的方法可以在不使用 for 循环的情况下完成此操作?提前致谢!

4

2 回答 2

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矩阵,您可以引入阻塞(即一次只处理多个矩阵)以增强缓存重用。

于 2012-11-22T16:29:26.457 回答
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.

您可能会考虑执行cat2x2 矩阵中的一个,然后仅执行 2 次乘法(在途中正确转置)。但是你会在catting 中浪费时间。

于 2012-11-22T16:28:37.130 回答