我有一个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
答案 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
中的元素。