矩阵是否包含向量?

Paw*_*wan 2 matlab

我正在寻找一种快速/简洁的方法来检查某些矩阵是否包含给定的向量,例如:

 bigMatrix = [1 1 1; 2 2 2; 4 4 4; 5 5 5];

 someFunction(bigMatrix, [1 1 1]) % = true
 someFunction(bigMatrix, [3 3 3]) % = false
Run Code Online (Sandbox Code Playgroud)

有这样的功能/操作符,还是我需要一个循环?

Col*_*ers 10

我建议以下解决方案:

bigMatrix = [1 1 1; 2 2 2; 4 4 4; 5 5 5];
Vec = [2 2 2];
Index = ismember(bigMatrix, Vec, 'rows');
Run Code Online (Sandbox Code Playgroud)

结果?

Index =

 0
 1
 0
 0
Run Code Online (Sandbox Code Playgroud)

ismember是一个非常有用的函数,它检查一组元素是否在另一组中.在这里,我利用rows选项强制函数比较行,而不是单个元素.

更新:另一方面,总是值得做一些速度测试!我只是将ismember方法与以下替代方法进行了比较:

N = size(bigMatrix, 1);
Index2 = zeros(N, 1);
for n = 1:N
    if all(bigMatrix(n, :) == Vec)
        Index2(n) = 1;
    end
end
Run Code Online (Sandbox Code Playgroud)

我的发现?bigMatrix事情的大小!特别是,如果bigMatrix是小的一面(有点用词不当),那么循环要快得多.第一种方法只有在bigMatrix变大时才是优选的.此外,结果还取决于列bigMatrix数以及行数!我建议你为你的应用程序测试两种方法,然后以更快的速度进行测试.(编辑:这是在R2011a)

一般说明:在过去的几年中,Matlab的循环速度有多快,我不断感到惊讶.Methinks矢量化代码不再是曾经的圣杯.