我有一个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},但是对于这个,应该只返回索引值? 如果你能帮助我,我将非常感激。提前谢谢
答案 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)';
是要搜索的目标行,沿第三维连接。x
从bsxfun
的所有行依次减去每一行,并将结果的大小与一些小的阈值进行比较(例如 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
的所有行进行比较)