Matlab:高效地从数组生成子数组

3
我有一个大小为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循环的方法。 - Hadi
1个回答

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,[])));

1
我也做了同样的事情,但是用了两个bsxfun(@plus..),性能几乎相同。 - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接