Matlab:如何使用索引列表从3D数组中提取特定单元格?

时间:2017-10-29 05:01:41

标签: matlab

我有一个源矩阵A(m,n),我使用过" find"现在我有一个所需索引的列表[y,x]。

我还有一个尺寸为B(m,n,3)的3D矩阵。

我想使用find的结果提取B中的所有元素。

因此,如果find产生4对结果,我希望得到一个4x3矩阵,其中Z维度的内容为B的结果索引。

我尝试过很多东西,但一直都失败了:

A = rand(480,640);
[y,x] = find(A < 0.5);
o = B(y,x,:);

Requested 39024x39024x3 (34.0GB) array exceeds maximum array size preference. 

我显然做错了,因为B有尺寸(640,640,3)。

2 个答案:

答案 0 :(得分:0)

通过您尝试索引的方式,matlab尝试使用y和x中的元素的每个组合来索引B,从而产生大量矩阵。我已经实现了for loop来做我认为你在问的问题。

我还要注意,为了在B之间进行索引,前两个维度需要与A相同,否则您将无法将B索引到A之后A = rand(480,640); B = rand(480,640,3); [x,y] = find(A < 0.5); o = zeros(size(x,1),1,3); % x and y are the same length so it doesn't matter for i = 1:size(x,1) o(i,1,:)= B(x(i),y(i),:); end o = reshape(o,size(x,1),3); 中的最大行或列索引。

newState.guests = []

答案 1 :(得分:0)

您可以reshape B到大小为[m*n , 3]的2D矩阵,然后使用逻辑索引来提取元素:

C = reshape(B, [], 3);
o = C(A<0.5, :);