【问题标题】:Matlab: Efficiently Generating Subarrays from an arrayMatlab:从数组有效地生成子数组
【发布时间】:2015-06-03 23:10:48
【问题描述】:

我有一个m x m 矩阵M,我对它的不同部分进行采样以生成k 子数组到n x n x k 矩阵N。我想知道的是:如果没有 for 循环,这可以有效地完成吗?

这是一个简单的例子:

M = [1:10]'*[1:10];                 %//' Large Matrix
indxs = [1 2;2 1;2 2];
N = zeros(4,4,3);                   %// Matrix to contain subarrays

for i=1:3,
   N(:,:,i) = M(3-indxs(i,1):6-indxs(i,1),3-indxs(i,2):6-indxs(i,2));
end

在我的实际代码中,矩阵 MN 相当大,并且此操作循环了数千次,因此这种低效率对运行时造成了重大影响。

【问题讨论】:

  • 您可以使用 parfor(在 gpu 上并行运行)来最大化速度,但我认为没有办法不使用 for 循环。

标签: performance matlab matrix vectorization matrix-indexing


【解决方案1】:

它可以使用bsxfun 进行两次矢量化。但这并不意味着它一定会更高效:

M = [1:10].'*[1:10]; %'// Large Matrix
indxs = [1 2;2 1;2 2];

r = size(M,1);
ind = bsxfun(@plus, (3:6).', ((3:6)-1)*r); %'// "3" and "6" as per your example
N = M(bsxfun(@minus, ind, reshape(indxs(:,1)+indxs(:,2)*r, 1,1,[])));

【讨论】:

  • 我最后做了同样的事情,但是用两个 bsxfun(@plus..) 代替了几乎相同的性能。
猜你喜欢
  • 2014-07-07
  • 2014-02-21
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多