在Matlab中将数组的某个部分切片到新数组

时间:2015-04-06 02:44:13

标签: matlab

我在Matlab中有两个数组。

X = dim(700, 1000) 

Y = dim(1, 1000) 

Y中的值在0到9之间变化。我想找到Y的索引,其值是特定值i,并在X中复制相应的值。

例如,

[a,b] = find(Y == 5)

假设有20个单元格,其值在Y中为5.然后a和b看起来像a = [1,1,1,1,1, .... 1](因为只有一列),b = [2, 3, 10, 15 .... ]

现在我想采取X(:, b's value)。在MATLAB中编写此代码的有效方法是什么?我能想到的一种天真的方式是:

  for i in size(b)
      X' = [X', X(:, b)]

2 个答案:

答案 0 :(得分:1)

如果我正确地解释了您的问题,您希望获取由X中相应位置描绘的Y的某些列,并构建一个新的矩阵,从Y中的这些位置进行采样}。您所要做的就是:

ind = 5; %// Value you are searching for
Xout = X(:,Y == ind);

Y == ind是一个逻辑向量,其中0不满足您要搜索的条件,1满足您要查找的条件。例如,如果Y是:

Y = [5 5 4 4 3 5 2 1]

Y == 5会给:

[1 1 0 0 0 1 0 0]

您可以使用逻辑索引切片到数组或矩阵中,并提取出您想要的内容。因此,如果您这样做:

X(:, Y == 5);

这意味着我们希望提取第1,2和6列的所有行。因此,您将从X中提取出来自第1,2和6列的三列矩阵。

因此,如果我正确理解您的问题,您希望从X中提取Y中相应位置需要符合特定条件的列。最有效的方法就是我在本文开头概述的内容。


希望这有帮助!祝好运!

答案 1 :(得分:0)

您似乎只需获取Y的排序索引,并使用这些索引索引到X以获得预期输出。这是代码 -

[~,idx] = sort(Y)
X_out = X(:,idx)

示例运行以获取解释

予。随机输入,X和Y -

X =
    0.2967    0.2625    0.4886    0.5468    0.6791    0.8852    0.3354
    0.3188    0.8010    0.5785    0.5211    0.3955    0.9133    0.6797
    0.4242    0.0292    0.2373    0.2316    0.3674    0.7962    0.1366
    0.5079    0.9289    0.4588    0.4889    0.9880    0.0987    0.7212
    0.0855    0.7303    0.9631    0.6241    0.0377    0.2619    0.1068
Y =
     1     4     2     3     4     5     2

II。 Y的排序索引为 -

idx =
     1     3     7     4     2     5     6

这些列索引(idx)将用于从X中提取特定列。

  • 由于Y==1适用于Y中的第一个索引,因此第一列输出将为X(:,1)

  • 由于Y==2是第三个& Y中的第七个索引,X中的第三和第七列,即X(:,3)& X(:,7)将被追加 到输出数组。

此追加过程将持续到我们完成Y中的所有索引,从而为我们提供下一个列出的最终输出 -

out =
    0.2967    0.4886    0.3354    0.5468    0.2625    0.6791    0.8852
    0.3188    0.5785    0.6797    0.5211    0.8010    0.3955    0.9133
    0.4242    0.2373    0.1366    0.2316    0.0292    0.3674    0.7962
    0.5079    0.4588    0.7212    0.4889    0.9289    0.9880    0.0987
    0.0855    0.9631    0.1068    0.6241    0.7303    0.0377    0.2619