计算二维矩阵的相同行
Counting the same rows of 2D matrix
我有一个两列矩阵。我需要把它变成三列,其中第三列显示前两个在输入矩阵中作为一行出现的次数。
基本上:输入
[1 1;
1 1;
1 2;
1 2;
1 3]
期望输出:
[1 1 2;
1 2 2;
1 3 1]
我已经知道 accumarray 和 unique 的适当组合应该具有魅力。我只是不知道如何正确组合它们。
你说得对,unique
and accumarray
非常适合这个任务:
x = [1 1; 1 1; 1 2; 1 2; 1 3]; % input
[~, v, w] = unique(x, 'rows', 'stable'); % unique indices and labels
c = accumarray(w, 1); % counts
y = [x(v,:) c]; % output
如果您希望输出行按字典顺序排序,请移除 'stable'
标志。
您也可以将 accumarray
替换为 bsxfun
以获得计数:
c = sum(bsxfun(@eq, unique(w), w.'), 2);
对于x
的条目是正整数的特殊情况,并且你希望按字典顺序输出,你也可以使用sparse
and find
,如下所示:
x = [1 1; 1 1; 1 2; 1 2; 1 3]; % input
[ii,jj,vv] = find(sparse(x(:,1), x(:,2), 1));
y = [ii(:), jj(:), vv(:)]; % output
一种可能的解决方案:
clear
a=...
[1 1;
1 1;
1 2;
1 2;
1 3]
[U,~,ic]=unique(a,'rows');
[C] = histc(ic,unique(ic));
Result=[U,C]
我有一个两列矩阵。我需要把它变成三列,其中第三列显示前两个在输入矩阵中作为一行出现的次数。
基本上:输入
[1 1;
1 1;
1 2;
1 2;
1 3]
期望输出:
[1 1 2;
1 2 2;
1 3 1]
我已经知道 accumarray 和 unique 的适当组合应该具有魅力。我只是不知道如何正确组合它们。
你说得对,unique
and accumarray
非常适合这个任务:
x = [1 1; 1 1; 1 2; 1 2; 1 3]; % input
[~, v, w] = unique(x, 'rows', 'stable'); % unique indices and labels
c = accumarray(w, 1); % counts
y = [x(v,:) c]; % output
如果您希望输出行按字典顺序排序,请移除 'stable'
标志。
您也可以将 accumarray
替换为 bsxfun
以获得计数:
c = sum(bsxfun(@eq, unique(w), w.'), 2);
对于x
的条目是正整数的特殊情况,并且你希望按字典顺序输出,你也可以使用sparse
and find
,如下所示:
x = [1 1; 1 1; 1 2; 1 2; 1 3]; % input
[ii,jj,vv] = find(sparse(x(:,1), x(:,2), 1));
y = [ii(:), jj(:), vv(:)]; % output
一种可能的解决方案:
clear
a=...
[1 1;
1 1;
1 2;
1 2;
1 3]
[U,~,ic]=unique(a,'rows');
[C] = histc(ic,unique(ic));
Result=[U,C]