0

我有一个二维矩阵让我们假设矩阵的值

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}的索引,但是对于这个应该只返回索引值?如果您能帮我解决这个问题,我将不胜感激。先感谢您

4

2 回答 2

3

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

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

应该产生:

tf =
     0
     0
     1
     0
     0
     1

要获取行的索引,您可以应用find结果ismember(请注意,如果您打算将此向量用于矩阵索引,则它是多余的)。这里find(tf)返回向量[3; 6]

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

[tf, loc] = ismember(a, [10 12 19 21 3], 'rows')

返回loc = 4您的示例。请注意,这里a是第二个参数,以便输出变量loc包含有意义的结果。

处理浮点数

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

x = reshape(c', size(c, 2), 1, []);
tf = any(all(abs(bsxfun(@minus, a', x)) < eps), 3)';

本质上这是一个单行命令,但为了清楚起见,我将其拆分为两个命令:

  • x是要搜索的目标行,沿第三维连接。
  • bsxfun从 的所有行中依次减去每一行a,并将结果的大小与某个小的阈值(例如 eps)进行比较。如果一行中的所有元素都低于它,则将此行标记为“1”。
于 2013-05-23T14:34:57.537 回答
1

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

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

那么匹配的行显然是:2 1 2 3


编辑:

让我扩展使用@EitanTismember显示的处理浮点比较的想法:

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

于 2013-05-23T14:36:14.603 回答