我正在寻找一种快速/简洁的方法来检查某个矩阵是否包含给定的向量,例如:
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
是否有这样的功能/运算符,或者我需要一个循环?
我正在寻找一种快速/简洁的方法来检查某个矩阵是否包含给定的向量,例如:
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
是否有这样的功能/运算符,或者我需要一个循环?
我建议以下解决方案:
bigMatrix = [1 1 1; 2 2 2; 4 4 4; 5 5 5];
Vec = [2 2 2];
Index = ismember(bigMatrix, Vec, 'rows');
结果?
Index =
0
1
0
0
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
我的发现?bigMatrix
事情的大小!特别是,如果bigMatrix
它偏小(有点用词不当),那么循环要快得多。只有当bigMatrix
变大时,第一种方法才更可取。此外,结果还取决于有多少列bigMatrix
以及行!我建议您为您的应用程序测试这两种方法,然后选择更快的方法。(编辑:这是在 R2011a 上)
一般说明:在过去几年中,Matlab 的循环速度变得如此之快,令我不断感到惊讶。Methinks 矢量化代码不再是曾经的圣杯。