【问题标题】:Finding the non-intersecting rows in a matrix查找矩阵中不相交的行
【发布时间】:2015-10-11 11:08:24
【问题描述】:

我想在一个大矩阵中找到不相交的行。举个例子:

A=[1 5 3; 3 4 5; 7 9 10;4 5 6;11 2 8; 3 5 10]

在这个矩阵中,不相交的行是:[1 5 3], [11 2 8][7 9 10]。如何在 Matlab 中快速编程?

【问题讨论】:

  • 什么是不相交的行?
  • @AndrasDeak 据我所知,如果行中的任何元素在之前的任何行中使用,则不会在最终输出中考虑一行。
  • @Andras Deak:正如 Divakar 所讨论的那样。谢谢迪瓦卡。

标签: matlab matrix


【解决方案1】:

如果我可以bsxfun -

M = squeeze(any(bsxfun(@eq,A,permute(unique(A),[3 2 1])),2))
[~,row_idx] = max(M,[],1)
out = A(sum(M,2).' == histc(row_idx,1:size(A,1)),:)

示例逐步运行 -

A =
     1     5     3
     3     4     5
     7     9    10
     4     5     6
    11     2     8
     3     5    10
M =
     1     0     1     0     1     0     0     0     0     0     0
     0     0     1     1     1     0     0     0     0     0     0
     0     0     0     0     0     0     1     0     1     1     0
     0     0     0     1     1     1     0     0     0     0     0
     0     1     0     0     0     0     0     1     0     0     1
     0     0     1     0     1     0     0     0     0     1     0
row_idx =
     1     5     1     2     1     4     3     5     3     3     5
out =
     1     5     3
     7     9    10
    11     2     8

【讨论】:

  • 我在看bsxfun,但被我尝试使用的intersect 函数打败了。干得好
  • “如果我可以bsxfun”:如果不是你,谁可以?;)
  • @asd2014 要允许一个值交叉,您可以这样做:out = A(sum(M,2).' - histc(row_idx,1:size(A,1)) <= 1,:)
  • @Divakar 这个解决方案是完美的。但是,我的矩阵是 sym 类型的。因此,bsxfun 不处理 sym 变量。
  • @asd2014 是的,那将是一个问题。符号变量是一种全新的球类游戏。
【解决方案2】:

您可以查找将它们添加到先前行的并集的行,从而使并集中的元素数量增加了列数(即该行中的所有元素都是新元素):

B = []; 
C = zeros(1,size(A,1)); 
for k=1:size(A,1), 
    B1 = union(B, A(k,:)); 
    C(k) = numel(B1)-numel(B); 
    B=B1; 
end
result = A(C==size(A,2),:);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-09
    • 2021-05-17
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多