【问题标题】:Determining if any duplicate rows in two matrices in MatLab确定 MatLab 中两个矩阵中是否有重复行
【发布时间】:2014-03-24 23:56:00
【问题描述】:

问题简介:

我正在建模一个系统,其中我有一个矩阵 X=([0,0,0];[0,1,0],...) ,其中每一行代表 3D 空间中的一个点。然后我选择一个随机行 r,并取所有后续行并围绕 r 表示的点旋转,并从这些行创建一个新矩阵 X_rot。我现在想检查 X_rot 中的任何行是否等于 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-matrix 包含 N+1 行,我有 12 种不同的旋转操作可以应用于子矩阵 x_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,:));

【问题讨论】:

  • 分享你计算的代码X_rot?

标签: matlab duplicates


【解决方案1】:

两种可能的方法(我不知道它们是否比使用unique更快):

  1. 使用pdist2:

    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);
    
  2. 使用bsxfun:

    d = squeeze(any(bsxfun(@ne, X, permute(X_rot, [3 2 1])), 2));
    result = any(d(:)==0);
    

如果有一行X 等于X_rot 的某行,则result1,否则为0

【讨论】:

  • 您对bsxfun 的建议在我的情况下似乎以unique 的70% 的时间运行,因此有了显着的改进。非常感谢,您为我节省了很多时间。
【解决方案2】:

ismember(X_rot, X, 'rows')怎么样?

【讨论】:

  • “相同索引行”是什么意思?比如,它将X_rot(1,:)X(1,:)X_rot(2,:)X(2,:) 进行比较,等等?在这种情况下,否 - 从功能上讲,ismember(A, B) 将获取A 中的每一行并搜索B 中的所有行,直到找到匹配项或用尽B 中的所有行而没有找到匹配项。
  • 我需要它来告诉我x_rot 的任何元素是否包含在 x 987654334@?
  • 没有。 ismember 将返回一个逻辑向量和索引,指示x_rot每个元素或行 是否包含在x 中,如果包含在哪里。例如。如果 x_rot 是 125 行长,那么 [tf,ix] = ismember(x_rot, x, 'rows') 将为 tf 返回一个 125 长的逻辑索引,为 ix 返回一个 125 长的双索引,x_rot(tf,:) 将为您提供所有重复的行x 中的行数。
  • 不,抱歉没有正确阅读文档。但是在我的实现中,与独特的方法相比它很慢。但感谢您的反馈
  • @AndrewJanke 你是对的。我的意思是,但现在我发现我错了。很抱歉造成混乱。为这种方法 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多