在3d矩阵中查找值

时间:2018-03-25 15:32:05

标签: matlab octave

我想做相同的

x = [1, 0, 3; 2, 3, 0; 0, 0, 3];
[yy, xx, vals] = find(x);

我真的需要vals变量。我需要这三个,但vals很重要。现在考虑3d情况,并翻转一个,所以它更有趣。

x = repmat(x, [1, 1, 3]);
x(:, :, 2) = fliplr(x(:, :, 1));

我想和以前一样。我在几个地方发现了这个

[yy, xx, zz] = ind2sub(size(x), find(x));

但后来我不知道如何正确地提取vals ......我也不太关心zz,但我确定他们需要某种方式用于索引。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

带有一个输出参数的

find,正如您在上一个语句中使用的那样:

[yy, xx, zz] = ind2sub(size(x), find(x));

将线性索引返回到矩阵中。您可以使用这些索引:

index = find(x);
vals = x(index);
[xx,yy,zz] = ind2sub(size(x), index);

答案 1 :(得分:2)

我不确定我是否理解你想要达到的目标,不过,考虑到你的最后一个矩阵x

x = [1, 0, 3; 2, 3, 0; 0, 0, 3]
z = repmat(x, [1, 1, 3]);
x(:, :, 2) = fliplr(x(:, :, 1))

[yy, xx, vals] = find(x)
你有:

  • yy找到的元素行的索引
  • xx找到的元素的列的索引

然后你可以使用

lin_idx=sub2ind(size(x),yy,xx)

获取矩阵x

内的值的线性索引

现在可以使用

[a,b,c]=ind2sub(size(x),lin_idx)

获取矩阵中元素的3D索引

您可以使用该索引访问值:

for i=1:length(a)
   k(i)=x(a(i),b(i),c(i))
end

现在,数组k包含值(根据vals返回的数组find)。