我有许多2×2的矩阵S1,S2,...,SN,并在每个矩阵上,我想执行左右矩阵乘法,如R * S * R^T,其中R也是一个2乘2的矩阵。很明显,我可以用for循环写这个,但我预计它在MATLAB中对大N很慢。是否有一种简单而有效的方法可以在不使用for循环的情况下完成此操作?提前致谢!MATLAB中有效的方法将相同的左和右矩阵乘法应用于一大组矩阵
1
A
回答
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
我要说的是,这里的循环并不坏,而不是慢,考虑这个
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
相关问题
- 1. Matlab有效的稀疏矩阵乘法
- 2. 乘法矩阵Matlab
- 3. Matlab 2x2矩阵的阵列和逐元矩阵/向量乘法
- 4. MATLAB - 阵列和矩阵乘法
- 5. Matlab基于元素的矩阵乘法
- 6. SSE矩阵,矩阵乘法
- 7. 高效矩阵乘法在Matlab
- 8. Eigen中有效的矩阵转置矩阵乘法
- 9. Matlab - 将矩阵乘以3D矩阵的每个矩阵
- 10. Matlab大矩阵乘法限制
- 11. MATLAB中非常大的矩阵的高效乘法
- 12. 矩阵乘法
- 13. 矩阵乘法
- 14. 矩阵乘法
- 15. 矩阵乘法
- 16. Numpy高效矩阵乘法
- 17. 对于大型矩阵,CUDA矩阵乘法中断
- 18. Matlab矩阵乘法元素明智地从不同大小的矩阵
- 19. 在较大的矩阵中删除相同的子矩阵。 Matlab
- 20. 矩阵的乘法
- 21. 的矩阵乘法
- 22. matlab中的3维矩阵乘法
- 23. 矩阵序列的矩阵乘法
- 24. 矩阵的矩阵列乘法
- 25. Cuda矩阵乘法 - 不适用于某些非方形矩阵
- 26. 将matlab矩阵转换为C++数组的有效方法
- 27. MATLAB:乘法2D矩阵与3D矩阵单元阵列
- 28. Matlab矩阵乘法和转置精度
- 29. Matlab的:乘法矩阵高效和低效
- 30. C#中的矩阵乘法方法
我正要写出乘法运算。感谢您拯救我的工作:) – Jonas
@Jonas我的荣幸;) – angainor
感谢您的回答。你指出了一个我并未真正意识到的重要问题。 – TriSSSe