List combinations and count how many it appears

2 ビュー (過去 30 日間)
JL
JL 2019 年 8 月 9 日
コメント済み: JL 2019 年 8 月 10 日
I have 2 matrices, W and Y. Using both as references, I want to list the different combinations and count how many times it appears from Y. Only count Y if the correponsing W value is >0.
W =[ 25
0
0
28
0
0
25
0
0
25
0
0
15
14
0
0
25
0
0];
Y =[ 1 2 0 0
1 3 2 0
1 4 3 2
1 3 0 0
1 2 3 0
1 4 3 0
1 4 0 0
1 3 4 0
1 2 3 4
2 3 0 0
2 1 3 0
2 1 4 3
2 1 4 0
2 3 4 0
2 1 3 4
2 3 1 4
3 4 0 0
3 1 4 0
3 2 1 4];
Zlist =
[12;
13;
14;
23;
24;
34;]
Add 2 1 to 1 2; 3 1 to 1 3; 4 1 to 1 4; 3 2 to 2 3; 4 3 to 3 4 and 4 2 to 24
Also, for Y with more > 2 numbers in the row like [2 1 4], it will have a combinations of 2 1, 1 4, 2 4 while [2 3 4] has 2 3, 3 4 and 2 4.
Zlistcount =
[2;
1;
2;
2;
2;
2;]
  4 件のコメント
JL
JL 2019 年 8 月 9 日
Also, if we've counted how many 1 2 are there in Y, would we be able to tell which rows and columns they are located? For example, for 1 2, we know in W, they are situated at W(1,1) and W(13,1)
dpb
dpb 2019 年 8 月 9 日
Re-edit the posting so can copy and paste into command window and execute w/o editing the columns...as is is not readable

サインインしてコメントする。

採用された回答

Andrei Bobrov
Andrei Bobrov 2019 年 8 月 9 日
編集済み: Andrei Bobrov 2019 年 8 月 9 日
YY = Y(W~=0,:);
n = sum(YY>0,2);
k = factorial(n)./factorial(n-2)/2;
ie = cumsum(k);
ib = ie - k + 1;
zc = zeros(ie(end),2);
for ii = 1:numel(ib)
zc(ib(ii):ie(ii),:) = sort(nchoosek(YY(ii,YY(ii,:)>0),2),2);
end
[i1,i2,v] = find(accumarray(zc,1));
Zlistcount = [i1,i2,v];
and without loop (as in Dpb's answer):
YY = Y(W~=0,:);
zc = sort(cell2mat(arrayfun(@(x)nchoosek(YY(x,YY(x,:)>0),2),...
(1:size(YY,1))','un',0)),2);
[i1,i2,v] = find(accumarray(zc,1));
Zlistcount = [i1,i2,v];
  1 件のコメント
JL
JL 2019 年 8 月 10 日
Thanks Andrei and Dpb

サインインしてコメントする。

その他の回答 (1 件)

dpb
dpb 2019 年 8 月 9 日
編集済み: dpb 2019 年 8 月 9 日
y=Y(W~=0,:);
z=unique(sort(cell2mat(arrayfun(@(i) nchoosek(y(i,y(i,:)~=0),2),1:size(y,1),'uni',0).'),2),'rows');
nZ=arrayfun(@(i) sum(sum(ismember(y,z(i,:)),2)==2),1:size(z,1)).';
There's no other need for W once you've cleaned out the superfluous Y.
I suspect, but haven't thought about it at all, that a clever application of accumarray might also be a solution...
  4 件のコメント
Adam Danz
Adam Danz 2019 年 8 月 9 日
That's been on my mental wishlist for a long time and I'm surprised it's not already an option since it's such a common need.
Guillaume
Guillaume 2019 年 8 月 9 日
Well, you can always
cellfun(@fun, num2cell(array, 2))
to iterate over the rows. Simple to type but of course, there's the overhead of the transformation to cell array.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by