matlab - 如何让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 以更快的速度计算所有线程的矩阵?
解决方案
您应该始终使用矩阵和向量运算而不是 for 循环。
如果x
和y
在所有情况下都是恒定的,则可以使用meshgrid生成x
和y
一次。
例如,考虑以下使用双 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
.
推荐阅读
- performance - Zabbix 性能调优(使用代理)
- java - 在Hashmap中找到几个最大值
- android - Xamarin.Android - 在使用本地通知关闭应用程序后保持应用程序在后台运行
- azure - 单个网络作业中的许多触发器
- scala - Scala 对 Future[Option] 的理解无一例外
- for-loop - 我怎样才能摆脱 t.test 的“没有足够的 x 观察”错误?矩阵数据比较
- unix - 一个补丁文件中的多个差异输出
- c++ - 从文件读取/写入时的内存和时间问题
- python - TypeError: Person() 没有参数
- java - Freemarker 折断线