【问题标题】:How do I compare elements of one row with every other row in the same matrix如何将一行的元素与同一矩阵中的每一行进行比较
【发布时间】:2009-11-17 16:04:23
【问题描述】:

我有矩阵:

a = [ 1 2 3 4;
      2 4 5 6;
      4 6 8 9]

我想将每一行与其他两行一一进行比较。如果他们共享相同的密钥,那么结果将告诉他们有一个共同的密钥。

【问题讨论】:

  • 所有行是否必须共享一个公共键才能被计数?
  • 我的意思是,第一行有 1 2 3 4,第二行有 2 4 5 6,所以两者的共同键是 2 和 4,我想知道我们如何得到这个交集在同一个矩阵中?

标签: matlab matrix comparison


【解决方案1】:

使用@gnovice 的想法,使用 nchoosek 获得所有组合,我提出了另外两个解决方案:

  • 一个使用 ismember(如 @loren 所述)
  • 另一个使用 bsxfuneq 函数句柄

唯一的区别是 intersect 只对唯一的公共键进行排序和保留。

a = randi(30, [100 20]);
%# a = sort(a,2);

comparisons = nchoosek(1:size(a,1),2);
N = size(comparisons,1);
keys1 = cell(N,1);
keys2 = cell(N,1);
keys3 = cell(N,1);

tic
for i=1:N
    keys1{i} = intersect(a(comparisons(i,1),:),a(comparisons(i,2),:));
end
toc

tic
for i=1:N
    query = a(comparisons(i,1),:);
    set = a(comparisons(i,2),:);
    keys2{i} = query( ismember(query, set) );             %# unique(...)
end
toc


tic
for i=1:N
    query = a(comparisons(i,1),:);
    set = a(comparisons(i,2),:)';
    keys3{i} = query( any(bsxfun(@eq, query, set),1) );   %'# unique(...)
end
toc

...具有以下时间比较:

Elapsed time is 0.713333 seconds.
Elapsed time is 0.289812 seconds.
Elapsed time is 0.135602 seconds.

请注意,即使事先对a 进行排序并在循环(注释部分)内添加对unique 的调用,这两种方法仍然比intersect 快。

【讨论】:

    【解决方案2】:

    这是一种解决方案(可推广到比问题中的样本更大的矩阵):

    comparisons = nchoosek(1:size(a,1),2);
    N = size(comparisons,1);
    keys = cell(N,1);
    for i = 1:N
      keys{i} = intersect(a(comparisons(i,1),:),a(comparisons(i,2),:));
    end
    

    函数NCHOOSEK 用于生成所有唯一行比较组合。对于您问题中的矩阵a,您将得到comparisons = [1 2; 1 3; 2 3],这意味着我们需要比较第1 行和第2 行,然后是第1 行和第3 行,最后是第2 行和第3 行。keys 是一个cell array,它存储每次比较的结果。对于每次比较,函数INTERSECT 用于查找公共值(即键)。对于问题中给出的矩阵a,您将得到keys = {[2 4], 4, [4 6]}

    【讨论】:

    • 还有一个问题,如果a是100*20的矩阵,我们应该怎么做才能将100行与其他行进行比较并得到每一行的交集?
    • @gurwinder:上面的代码足够通用,可以处理a 的任何大小。如果 a 是 100×20,您最终将执行 4950 次比较,因此 comparisons 将是一个 4950×2 矩阵,keys 将是一个具有 4950 个元素的元胞数组(其中每个元胞包含一个用于相应比较的一组常用键)。
    • @Amro:谢谢。我很想再次使用我的 HANKEL 解决方案 (stackoverflow.com/questions/1702140/…),但 NCHOOSEK 更清晰一些,我认为 OP 将使用相对较小的矩阵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多