【问题标题】:Identifying Matrix element links/connection MATLAB识别矩阵元素链接/连接 MATLAB
【发布时间】:2014-10-15 05:33:49
【问题描述】:

您好,我有一个相关矩阵:

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

我需要找出第 1 行的每个单独元素链接到第 2 行的元素的次数。

例如这里第 1 行的元素 1 与第 2 行的后续元素 {2, 4, 6, 8} 相关,所以总共有 4 个元素。

类似地,2 链接到 {3, 6},总共有 2 个元素。

生成的矩阵 C 应该是:

[element name in 1st row; Number of connection].

在前面的例子中,C = [1 2 ....; 4 2 ...];

由于实际矩阵大小为 1000s' 量级,因此无法手动完成。任何帮助将不胜感激。

【问题讨论】:

  • 如果[1;2] 列出现两次怎么办?是否应该计算两次?

标签: matlab matrix


【解决方案1】:

可能有一种方法可以在不使用 for 循环的情况下做到这一点,但这是我现在能想到的一种解决方案。识别矩阵 A 第一行中的唯一元素并遍历所有元素以在第二行中找到它们链接的元素。

我假设您只需要识别第一行链接到的唯一元素,因此 for 循环内的 unique() 函数;如果不是这种情况,请从代码中删除它。

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

row1el = unique(a(1, :));

c = zeros(2, length(row1el));
for i = 1:length(row1el)
  idx = a(1, :) == row1el(i);
  linkedEl = a(2, idx);
  c(1, i) = row1el(i);
  c(2, i) = length(unique(linkedEl));
end
disp(c)

【讨论】:

  • 不错的第一个答案 +1。欢迎来到 SO!
  • 你应该避免使用i作为增量变量,因为它与复杂表达式的虚部冲突。
【解决方案2】:

如果我正确理解了这个问题,那么您并不是真正关心第二行中的 ,而是第 1 行中元素的出现次数。这可以通过@987654321 获得@ 和 histc 函数:

C(1,:)=unique(A(1,:));
C(2,:)=histc(A(1,:),C(1,:));

C =

     1     2     3     4     5
     4     2     2     1     1

【讨论】:

  • 我没有看到这个解决方案。 +1 用于发现如何以非常简单的方式解决问题。如果只计算一次重复的行,您可以执行 A2 = unique(A.', 'rows').';,然后按照您的代码继续使用 A2
【解决方案3】:

答案取决于是否应重复计算重复的列。考虑以下数据:

A = [1 2 1 3 1 2 4 3 5 1; 
     2 3 4 5 6 6 6 5 7 8]; %// col [3;5] appears twice
  1. 如果重复的列应该根据其多重性计数:您可以使用accumarray

    [ii, ~, kk] = unique((A(1,:)));
    jj = accumarray(kk.', A(2,:).', [], @(x) numel(x)).';
    C = [ii; jj];
    

    我的例子A的结果:

    C =
         1     2     3     4     5
         4     2     2     1     1
    

    或者你可以使用sparse:

    [~, ii, jj] = find(sum(sparse(A(2,:), A(1,:), 1)));
    C = [ii; jj];
    

    结果同上。

  2. 如果重复的列应该只计算一次:这两种方法中的任何一种都很容易适应这种情况:

    [ii, ~, kk] = unique((A(1,:)));
    jj = accumarray(kk.', A(2,:).', [], @(x) numel(unique(x))).'; %'// note: "unique"
    C = [ii; jj];
    

    [~, ii, jj] = find(sum(sparse(A(2,:), A(1,:), 1) > 0));  %// note: ">0"
    C = [ii; jj];
    

    结果(注意第三列与之前不同):

    C =
         1     2     3     4     5
         4     2     1     1     1
    

【讨论】:

  • +1 表示与我的不同,它处理冗余的解决方案。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多