使用二进制映射过滤多维数组(逻辑索引低效)

时间:2015-07-12 19:30:20

标签: matlab matrix multidimensional-array filter

我是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(我调查了这个但是无法解决任何问题)。

1 个答案:

答案 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(:), :);