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

时间:2014-10-14 16:20:49

标签: matlab matrix

嗨,我有一个相关矩阵:

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',因此无法手动完成。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

可能有一种方法可以在不使用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 :(得分:2)

如果我正确理解了这个问题,你并不是真的关心第二行中的,而是关注第1行中元素的出现次数。这可以通过{{{ 1}}和unique函数:

histc

答案 2 :(得分: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