List combinations and count how many it appears
Show older comments
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 Comments
madhan ravi
on 9 Aug 2019
Edited: madhan ravi
on 9 Aug 2019
"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"
Could you explain with illustration relating to the example you gave above?
JL
on 9 Aug 2019
JL
on 9 Aug 2019
dpb
on 9 Aug 2019
Re-edit the posting so can copy and paste into command window and execute w/o editing the columns...as is is not readable
Accepted Answer
More Answers (1)
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 Comments
Thanks! Wasn't going to mess w/ it but intrigued me so despite the formatting went ahead anyways...
I had just caught the typo...I hadn't pasted everything and missed the second dimension. Good spot...I eliminated the ix temporary, besides as unneeded.
"also used nchoosek() along with arrayfun()."
I wish there were a 'rows|columns' optional argument to arrayfun so didn't have to resort to the expedient of the size(x,dim) indexing argument with the array buried in the anonymous function but could pass the desired vector directly. Maybe there should be a vectorfun besides...
Adam Danz
on 9 Aug 2019
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
on 9 Aug 2019
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.
Categories
Find more on Resizing and Reshaping Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!