我需要创建一个平方矩阵$ V $,每包超过100000次以上。 传统上来说,计算量大约为70s。(超过1分钟),我需要重复此过程100包以上,这大约要多花1个小时。
事实证明,当使用double for循环$ V(x,y)$计算矩阵时,matlab仅使用一个线程。但是,计算机中有12个线程,应该有一种方法可以使用所有线程更快地分配矩阵。
函数的类型是 $ V(x,y)= exp((x-variation_1)。^ 2+(y-variation_2)。^ 2)$
我考虑过使用GPU。但是,事实证明,GPU阵列的计算速度比CPU慢得多。
我还考虑过使用parpool函数。但是,不仅要花费更多时间将矩阵发送到并行池中,而且还无法访问$ V $本身。
如何告诉CPU以更快的速度计算所有线程的矩阵?
答案 0 :(得分:1)
您应该始终使用矩阵和向量运算,而不是for循环。
如果x
和y
在所有情况下都是常数,则可以使用meshgrid生成一次x
和y
。
例如,考虑以下代码,该代码使用double for循环:
v = zeros(10000,10000);
tic;
for x=1:10000
for y = 1:10000
v(x,y) = exp((x/10000).^2+(y/10000).^2);
end
end
toc
在我的计算机上,它大约运行11秒钟。
现在,使用meshgrid
:
%This is done only once
[x,y] = meshgrid((1:10000)/10000,(1:10000)/10000);
tic;
v = exp(x.^2+y.^2);
toc
这大约需要4秒钟,不包括meshgrid
。