How to search for a previous element that is equal in prior loop iteration
조회 수: 3 (최근 30일)
이전 댓글 표시
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
Image Analyst
2015년 12월 28일
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?
채택된 답변
harjeet singh
2015년 12월 28일
hello tim try this code
a=[1 1 3;
1 2 2;
1 3 3;
2 1 1;
2 2 3;
2 3 2;
2 4 4];
for i=1:size(a,1)
[r,c]=find(a(1:i,2)==a(i,2));
b(i,1)=length(r);
end
b
추가 답변 (1개)
Guillaume
2015년 12월 29일
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).
참고 항목
카테고리
Help Center 및 File Exchange에서 Data Type Conversion에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!