我有很多 2×2 矩阵 S1、S2、...、SN,并且在每个矩阵上,我想像 R*S*R^T 一样执行左右矩阵乘法,其中 R也是一个 2×2 矩阵。显然我可以用一个 for 循环来写这个,但我预计它对于 MATLAB 中的大 N 来说会非常慢。有没有一种简单有效的方法可以在不使用 for 循环的情况下完成此操作?提前致谢!
问问题
116 次
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.
您可能会考虑执行cat
2x2 矩阵中的一个,然后仅执行 2 次乘法(在途中正确转置)。但是你会在cat
ting 中浪费时间。
于 2012-11-22T16:28:37.130 回答