识别矩阵元素链接/连接MATLAB



嗨,我有一个相关矩阵:

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 ...]

由于实际的矩阵大小约为1000秒,因此无法手动进行。任何帮助都将不胜感激。

可能有一种方法可以在不使用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行中元素的出现次数。这可以通过uniquehistc函数获得:

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

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

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
    

最新更新