我是matlab的新手,所以我在找到执行此任务的最有效方法时遇到了一些麻烦。
我试图使用第二个矩阵N过滤掉一个矩阵M.
M = AxBxCxD其中A,B,C,D各自约为~150 N = AxBxC。上面的A,B,C相同。它的条目是二进制的。
我希望过滤矩阵M,因此它只包含N矩阵中的条目为1的数据。此外,我希望它是一个二维数组SxD,其中S是N中的1的元素数
到目前为止,我已尝试过两种方法,这两种方法都是内存密集型或速度慢的方法:
1)
indx = find(N(:));
[X,Y,Z] = ind2sub(size(M),indx);
result = squeeze(M(X,Y,Z,:));
第三次,M(X,Y,Z,:)的结果在内存中变得很大。
2)
l = logical(N) ;
map = repmat(l,'length of D dimension');
M(map);
%Reduce dimension next
但构建repmat(l,280)的计算时间相当可观。
有没有更有效的方法来计算这个结果。也许将掩模应用于沿着D维度的每一行M(我调查了这个但是无法解决任何问题)。
答案 0 :(得分:1)
您可以使用逻辑索引来完成此操作。我认为这是正确的维度,但我总是很难想到4D。
N = (rand(5, 7, 10) < 0.5);
M = rand(size(N,1), size(N,2), size(N,3), 3);
%Use reshape to go from a AxBxCxD array to an A*B*C x D matrix
m = reshape(M, numel(N), []);
M2 = m(N(:), :);