Counting specific element in one column corresponding to unique elements in an another column

1 view (last 30 days)
I have two vectors a and b. I want to count how many times the value '-1' appears in b corresponding to unique elements in a. Is there an efficient way to do this without loops?
a = [1,1,1,1,1,2,2,2,2,2,3,3,4,4,4,5,5,5,5,5,5]';
b = [1,1,-1,1,-1,-1,-1,-1,1,1,-1,1,1,-1,-1,1,1,-1,-1,1,1]';
desired output:
1--2
2--3
3--1
4--2
5--2

Accepted Answer

Jakob B. Nielsen
Jakob B. Nielsen on 20 Feb 2020
You can use logic indexing. Example:
length(b(a==1 & b==-1));
You get those entries from b which fulfils the condition that the corresponding index position in a must equal 1, and also that the same index position in b must equal -1.
& is logic AND - both conditions must be true to get an output. If you need a logic OR, the matlab operator is |
  3 Comments
Jakob B. Nielsen
Jakob B. Nielsen on 20 Feb 2020
Other than manual work, you probably wont get out of a loop entirely. But it is a very simple one;
%where N is your highest integer of a that you want the comparison for;
N=5;
for i=1:N
output(i)=length(b(a==i & b==-1));
end
Stephen23
Stephen23 on 20 Feb 2020
Edited: Stephen23 on 20 Feb 2020
"Other than manual work, you probably wont get out of a loop entirely"
Basic MATLAB functions like histc don't require a loop.

Sign in to comment.

More Answers (1)

Stephen23
Stephen23 on 20 Feb 2020
>> a = [1;1;1;1;1;2;2;2;2;2;3;3;4;4;4;5;5;5;5;5;5];
>> b = [1;1;-1;1;-1;-1;-1;-1;1;1;-1;1;1;-1;-1;1;1;-1;-1;1;1];
>> u = unique(a);
>> n = histc(a(b==-1),u);
>> m = [u,n]
m =
1 2
2 3
3 1
4 2
5 2

Categories

Find more on Loops and Conditional Statements 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!