在MatLab中确定两个矩阵中是否有重复行
问题简介: 我正在建模一个系统,其中我有一个矩阵X=([0,0,0];[0,1,0],…),其中每一行代表三维空间中的一个点。然后,我选择一个随机的行r,然后取下面所有的行,围绕r表示的点旋转,并从这些行X_rot生成一个新的矩阵。我现在想检查X_rot中的任何行是否等于X的任意两行(即,两个顶点相互重叠),如果是这种情况,请拒绝旋转并重试 实际问题: 到目前为止,我使用了以下代码:在MatLab中确定两个矩阵中是否有重复行,matlab,duplicates,Matlab,Duplicates,问题简介: 我正在建模一个系统,其中我有一个矩阵X=([0,0,0];[0,1,0],…),其中每一行代表三维空间中的一个点。然后,我选择一个随机的行r,然后取下面所有的行,围绕r表示的点旋转,并从这些行X_rot生成一个新的矩阵。我现在想检查X_rot中的任何行是否等于X的任意两行(即,两个顶点相互重叠),如果是这种情况,请拒绝旋转并重试 实际问题: 到目前为止,我使用了以下代码: X_sim=[X;X_rot]; if numel(unique(X_sim,'rows'))==numel(X
X_sim=[X;X_rot];
if numel(unique(X_sim,'rows'))==numel(X_sim);
X(r+1:N+1,:,:)=X_rot;
end
这是可行的,但它占用了我50%以上的运行时间,我正在考虑这里是否有人知道一种更有效的方法,因为我不需要从unique
获得的所有信息
另外,如果这很重要,那么我通常在X
中有100到1000行
致以最良好的祝愿,
莫顿
附加:
我的x
-矩阵包含N+1行,我有12种不同的旋转操作,可以应用于子矩阵x\u rot:
step=ceil(rand()*N);
r=ceil(rand()*12);
x_rot=x(step+1:N+1,:);
x_rot=bsxfun(@minus,x_rot,x(step,:));
x_rot=x_rot*Rot(:,:,:,r);
x_rot=bsxfun(@plus,x_rot,x(step,:));
两种可能的方法(我不知道它们是否比使用unique
更快):
result
是1
如果有一行X
等于某行X\u rot
,否则0
。ismember(X\u rot,X,'rows')如何
?在计算X_rot
的地方共享代码?在我的情况下,您对bsxfun
的建议在unique
的70%时间内运行,因此有了显著的改进。非常感谢,你为我节省了很多时间。你说的“相同的索引行”是什么意思?比如,它将X_-rot(1,:)
与X(1,:)
,X_-rot(2,:)
与X(2,:)
,等等进行比较?在这种情况下,no–在功能上,ismember(A,B)
将获取A
中的每一行,并搜索B
中的所有行,直到找到匹配项,或在未找到匹配项的情况下耗尽B
中的所有行。我需要它告诉我x
中是否包含x
的任何元素。如果我理解ismember
正确,则仅当所有x_-rot
的元素包含在x
中?否。ismember
将返回一个逻辑和索引向量,指示x_-rot
的每个元素或行是否包含在x
中,如果包含在哪里。例如,如果x_rot
的长度为125行,那么[tf,ix]=ismember(x_rot,x,'rows')
将为tf
返回一个125长的逻辑,为ix
返回一个125长的双索引,并且x_rot(tf,:)
将为您提供与x
中的行重复的所有行。否,抱歉,没有正确阅读文档。但是在我的实现中,它比独特的方法慢。但是谢谢你的邀请feedback@AndrewJanke你说得对。我是那个意思,但现在我明白我错了。很抱歉搞混了+1对于这种方法
d = pdist2(X, X_rot, 'hamming'); %// 0 if rows are equal, 1 if different.
%// Any distance function will do, so try those available and choose fastest
result = any(d(:)==0);
d = squeeze(any(bsxfun(@ne, X, permute(X_rot, [3 2 1])), 2));
result = any(d(:)==0);