How to search for a previous element that is equal in prior loop iteration
Show older comments
I have a Matrix called A as below
[1 1 3;
1 2 2;
1 3 3;
2 1 1;
2 2 3;
2 3 2;
2 4 4]
I want to produce a column vector that counts the number of times a value occurs in the 2nd column, I have tried the following function :
function count_stars(A)
total = 0;
for i = 1:size(A,1)
total = total + (A(i,2)==A(:,2));
end
total
This counts the number of matching values in the entire column e.g.
2
2
2
2
2
2
1
What I am wanting is to match to values between 1:i only rather than the entire column so that the output looks like this
1
1
1
2
2
2
1
Any insights you are able to share are greatly appreciated!
2 Comments
Image Analyst
on 28 Dec 2015
It's too late at night for me to work on this, but I'm thinking it might involve accumarray(), cumsum() or histcounts(). A question though, will the numbers always be integers? Or might they be floating point numbers with fractional parts?
Tim Baker
on 28 Dec 2015
Accepted Answer
More Answers (1)
Guillaume
on 29 Dec 2015
For small arrays, it does not matter but this is likely to be more efficient than harjeet's answer for large arrays:
a = [1 1 3;
1 2 2;
1 3 3;
2 1 1;
2 2 3;
2 3 2;
2 4 4];
[values] = unique(a(:, 3));
counts = zeros(size(a, 1), 1);
for val = values';
occurences = cumsum(a(:, 3) == val);
counts(a(:, 3) == val) = occurences(a(:, 3) == val);
end
Rather than looping over all the rows of a, it only loops over the unique values of a (4 iterations instead of 7 in this example).
1 Comment
Tim Baker
on 29 Dec 2015
Categories
Find more on Mathematics 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!