首页 > 解决方案 > 如何让Matlab在迭代过程中更快地创建矩阵?

问题描述

我需要每包迭代超过 100000 次创建方阵 $V$。传统上这样做时,计算消耗在 70 秒左右。(超过 1 分钟)我需要重复这个过程超过 100 包。这大约是 1 小时的额外时间。

事实证明,当使用双循环 $V(x,y)$ 计算矩阵时,matlab 仅使用单线程。但是,计算机中有 12 个线程,应该有一种方法可以使用它们来更快地分配矩阵。

函数的类型是 $V(x,y)=exp((x-variation_1).^2+(y-variation_2).^2)$

我考虑过使用GPU。然而,事实证明,GPU 阵列的计算速度比 CPU 慢得多。

我还考虑过使用 parpool 功能。然而,不仅将矩阵发送到并行池需要更多时间,而且还拒绝访问 $V$ 本身。

如何告诉 CPU 以更快的速度计算所有线程的矩阵?

标签: matlabmatrixparallel-processing

解决方案


您应该始终使用矩阵和向量运算而不是 for 循环。
如果xy在所有情况下都是恒定的,则可以使用meshgrid生成xy一次。

例如,考虑以下使用双 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.


推荐阅读