从原始矩阵中寻找向量索引

时间:2013-05-23 14:25:50

标签: matlab matrix-indexing

我有一个2d的矩阵让我们假设矩阵的值

a =
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    17    24     1     8    15
    11    18    25     2     9

这个矩阵将被随机分为三个不同的矩阵

b =
     17    24     1     8    15
     23     5     7    14    16

c =
      4     6    13    20    22
     11    18    25     2     9

d =
     10    12    19    21     3
     17    24     1     8    15

如何知道矩阵d中矢量的索引,例如在原始矩阵a中,注意矩阵的值可以重复。 例如,如果我想知道矩阵a中的索引{10 12 19 21 3}? 或者矩阵a中的索引{17 24 1 8 15},但是对于这个,应该只返回索引值? 如果你能帮助我,我将非常感激。提前谢谢

2 个答案:

答案 0 :(得分:3)

您可以将ismember'rows'选项一起使用。例如:

tf = ismember(a, c, 'rows')

应该产生:

tf =
     0
     0
     1
     0
     0
     1

要获取行的索引,可以对find的结果应用ismember(请注意,如果您计划使用此向量进行矩阵索引,则它是多余的)。此处find(tf)返回向量[3; 6]

如果您想知道矩阵a中与单个向量匹配的行数,您可以使用解释的方法并应用find,或使用{{1的第二个输出参数}}。例如:

ismember

为您的示例返回[tf, loc] = ismember(a, [10 12 19 21 3], 'rows') 。请注意,此处loc = 4是第二个参数,因此输出变量a将保留有意义的结果。

处理浮点数

如果您的数据包含浮点数,则loc方法将失败,因为浮点数比较不准确。以下是Amro解决方案的较短变体:

ismember

基本上这是一个单行,但为了清楚起见,我将它分成两个命令:

  • x = reshape(c', size(c, 2), 1, []); tf = any(all(abs(bsxfun(@minus, a', x)) < eps), 3)'; 是要搜索的目标行,沿第三维连接。
  • xbsxfun的所有行依次减去每一行,并将结果的大小与一些小的阈值进行比较(例如 eps )。如果一行中的所有元素都低于它,请将此行标记为“1”。

答案 1 :(得分:1)

这取决于你如何构建这些分割的矩阵。例如:

a = magic(5);
d = a([2 1 2 3],:);

然后匹配的行显然是:2 1 2 3


编辑:

让我扩展一下使用@EitanT显示的ismember来处理浮点比较的想法:

tf = any(cell2mat(arrayfun(@(i) all(abs(bsxfun(@minus, a, d(i,:)))<1e-9,2), ...
    1:size(d,1), 'UniformOutput',false)), 2)

不漂亮,但有效:)这对于比较来说是必要的,例如:0.1*3 == 0.3

(基本上它使用绝对差异将d的每一行与a的所有行进行比较)