【发布时间】:2013-05-26 09:50:15
【问题描述】:
我正在编写一段代码,它应该在 Nx3 矩阵 E 中找到包含 Mx3 矩阵 T 的值的行,但它们的顺序不一定相同。我写了一些有效的东西,但我对这种风格不满意,并希望使用ismember 对矩阵应用逻辑运算并找到,而不是我正在使用的循环:
E = [7 36 37; 9 1 5; 4 34 100; 4 12 33; 4 34 33];
T = [37 7 36; 4 34 33];
for i=1:size(T,1)
T(i,:) = sort(T(i,:));
end
for i=1:size(E,1)
E(i,:) = sort(E(i,:));
end
res = zeros(size(T,1),1);
for i=1:size(T,1)
a = ismember(E,t(i,:));
res(i,1) = find(sum(a,2)==3);
end
我的想法是对E 和T 的每一行进行排序,这样它们的顺序就会相同,然后用循环比较每一行。但是,我正在尝试学习以更 MATLAB 风格编写我的代码,并希望应用 ismember 并可能会找到执行相同的操作。像这样的:
a = sum(ismember(E,T(1,1))~=0,2);
b = sum(ismember(E,T(1,2))~=0,2);
c = sum(ismember(E,T(1,3))~=0,2);
r = find(a&b&c);
还有更优雅的解决方案吗?
谢谢!
【问题讨论】:
-
您考虑过
ismember(A,B,'rows')还是setdiff?任何基于排序的解决方案都可能会有点混淆,即使它是高性能的。