【发布时间】:2014-02-24 13:50:38
【问题描述】:
多维数组中的通信开销 (parfor) 和速度预分配 (for)
我在以下脚本中的 **'s 指示的位置收到两个警告
变量已编入索引但未切片...(第二个 parfor 循环中 ** 显示的数组 A)- 是什么原因造成的,如何避免?
变量似乎在每个循环中都会改变大小...(在 for 循环中由 ** 显示的数组 Sol)- 也许我做得不对,但预分配内存没有奏效。
编辑:我最初的想法是预先分配数组(就像在第一个 parfor 循环中所做的那样),以便它更快地执行脚本的其余部分(脚本的完整版本重复各种数组操作,类似于第二个 parfor 和 for 循环)。
有什么建议吗? :)
N = 1000;
parfor i=1:N
A(:,:,i) = rand(2);
X(:,:,i) = rand(2,1);
Sol1(1,1,i) = zeros();
Sol2(1,1,i) = zeros();
Sol(2,1,i) = zeros();
end
t0 = tic;
parfor i=1:N
Sol1(1,:,i) = A(1,:,i)*X(:,1,i);
Sol2(1,:,i) = **A**(2,:,i)*X(:,1,i);
end
for i=1:N
**Sol**(:,1,i) = [Sol1(1,:,i);Sol2(1,:,i)];
end
toc(t0);
【问题讨论】:
-
你是如何预分配内存的?
-
@bdecaf 我刚刚意识到我在第一个 parfor 循环中所做的(我的预分配想法)是完全错误的!为多维数组预分配的最佳方法是什么?
-
基本上我做
NaN(3,4,5,...),只需按顺序在其中写下尺寸的大小(你可以对zeros或ones做同样的事情-但我更喜欢看看什么时候没有值已分配)。
标签: performance matlab multidimensional-array