我有一个M x N x O
矩阵,我想MxN
使用b
大小向量将其简化为MATLAB中的矩阵,该向量M
包含要保留的第三维元素的索引。
然后,它要做的是构建一个2d数组,并从原始3d数组的各个页面中选择其条目。
我有这个循环,但是我对无循环解决方案感兴趣。
for i = 1:M
for j = 1:N
tmp(i, j) = P(i, j, b(i));
end
end
最简单的方法可能就是删除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
与预期中的元素相对应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句