通过使用一维的索引向量将3d减少到2d数组

时间:2016-12-18 22:49:04

标签: arrays matlab matrix multidimensional-array

我有一个M x N x O矩阵,我希望使用大小为MxN的向量b将其缩减为MATLAB中的M矩阵,该向量包含第三维中要保留的元素。

它的作用是构建一个二维数组,其条目从原始三维数组的各个页面中选择。

我有这个循环,但我对无循环解决方案感兴趣。

for i = 1:M
    for j = 1:N
        tmp(i, j) = P(i, j, b(i));
    end
end

1 个答案:

答案 0 :(得分:3)

最简单的方法可能是删除代码中的j循环:

for ii = 1:M
    tmp(ii, :) = P(ii, :, b(ii));
end

但是为了比较,这里是一个没有循环的解决方案。

给定一个3d数组P

M = 7;
N = 5;
O = 6;
P = ones(M, N, O) .* permute(1:O, [3 1 2]);

(在这种情况下,我使用了一个3d数组,其中每个元素等于其O索引)
b,大小为Mx1,其值为1..O

b = randi(O, M, 1)

您可以构建P(:,:,1)的所有元素的下标,并使用b选择要使用的平面:

[rr, cc] = ndgrid(1:M, 1:N);
inds = sub2ind(size(P), rr(:), cc(:), b(rr(:)));
tmp = reshape(P(inds), M, N)

有关:

b.' =    5   4   1   5   3   1   3

我们得到:

tmp =

   5   5   5   5   5
   4   4   4   4   4
   1   1   1   1   1
   5   5   5   5   5
   3   3   3   3   3
   1   1   1   1   1
   3   3   3   3   3

每行的元素对应于b中的元素。