嗨,我有一个相关矩阵:
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行中元素的出现次数。这可以通过unique
和histc
函数获得:
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
如果重复列应根据其多重性进行计数:则可以使用
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];
结果与上述相同。
如果重复列只计数一次:两种方法中的任何一种都很容易适应这种情况:
[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