我想知道为什么用A2=A^2
命令(A
为LxL
矩阵)对矩阵进行平方比仅仅做一个双for
循环和分配更快零值矩阵的值。
我运行了以下代码来检查第一个案例
tic
psi2=psi.^2;
T1=toc;
以及第二次
的以下内容psi2=zeros(L,L);
tic
for i=1:L
for j=1:L
psi2(i,j)=psi(i,j)^2;
end
end
T2=toc;
在this figure中显示了几个矩阵大小(L
)的经过时间,并且加速很明显。
我不会惊讶地看到MATLAB有一个非常有效的矩阵乘法实现,因为它是为它做的,但是我不能理解如何以更快的方式进行元素操作而不只是循环它。
谢谢你的时间。
答案 0 :(得分:4)
有几件事使得矢量操作比你的循环更快。
首先,编译成C ++代码的循环比解释/转换并编译为Java的脚本循环更快。
其次,C或C ++编译器可以使用单指令,多数据指令(SIMD)在单个操作中对多个矩阵元素进行操作。然后在多个线程中执行此操作。
最后,可以将操作推送到GPU,可以同时处理更多元素(数百个内核,而CPU上为4-8个)。你的脚本循环不能这样做。
答案 1 :(得分:1)
。^ 2利用CPU进行并行操作。对于嵌套循环(双循环)解决方案,整个解决方案按顺序完成。此外,它还可以增加循环控制变量和条件检查。