find a value & store in new variable (again)
이전 댓글 표시
Dear Matlab friends,
We recently posted a question about finding values and storing them in new variables:
Our question remains in the sense that we would like to know how to procede when we have a matrix rathen than a cell array.
Indeed, we have a 384 x 14 matrix A, and we would like to find all occurrences of number [2] in column 1, and save corresponded value in column 2 in a new variable "new_variable":
A =
3 5 6 ...
2 3 5
2 3 4
1 4 5
5 7 9
...
so the result would be:
new_variable =
2
2
The suggestion for cell arrays was
new_variable = A{2}(A{1} == 2);
We thank you very much for any suggestion!
Best,
Udiubu
답변 (3개)
Geoff
2012년 3월 19일
Use logical indexing:
new_variable = A(A(:,1)==2, 2);
This indexes all those rows of A where column 1 is equal to 2, selects column 2 and assigns the result to new_variable.
댓글 수: 13
Aldin
2012년 3월 19일
Look at my answer it is same as yours
Geoff
2012년 3월 19일
No, it isn't.
Aldin
2012년 3월 19일
How?
Aldin
2012년 3월 19일
Please explain
Ubu
2012년 3월 19일
Aldin
2012년 3월 19일
Which is the correct answer. Please press 'Accept answer' that we know that's the question closed successfully
Geoff
2012년 3월 19일
@Aldin: You used several lines and a loop, I used a one-line logical index. The result might be the same, but the solutions are not.
@Ubu: If you construct the matrix A from columns that are cells as you described, it will actually be a cell. If you want A to be a matrix, you need to then call A = cell2mat(A).
Aldin
2012년 3월 19일
@Geoff: Yes, but Your code is not exactly clear for beginners in MATLAB.
Ubu
2012년 3월 19일
Ubu
2012년 3월 19일
Geoff
2012년 3월 19일
@Ubu: Then you asked the wrong question. Your matrix is actually a cell. I'll answer separately so the code is formatted correctly. =)
@Aldin: Your profile states that you are "here to learn MatLab", yet if you indeed just learned something you don't seem to be very pleased.
Ubu
2012년 3월 19일
Aldin
2012년 3월 19일
@Geoff: How do you mean?
Geoff
2012년 3월 19일
Okay, since your matrix actually contains cells the equality operator doesn't work. I'll split the code up for extra clarity, since another reader insists ;-)
I'm still not sure if you want to replace column 2 with the value 2 or just copy the filtered column 2 into new_variable... The question was confusing. Anyway,
I would do this:
rowidx = cellfun( @(x) x==2, A(:,1) );
new_variable = cell2mat(A(rowidx,2));
cellfun maps a function over all elements of a cell-array or matrix. The '@(x) x==2' part is an anonymous (on-the-fly/adhoc) function. Here we use it on the first column. The output is a vector of booleans, which we then use as a logical index.
Edit:
The other way is to just extract the numeric columns that are of interest and use my other solution that works on matrices:
B = cell2mat(A(:,1:2));
new_variable = B( B(:,1)==2, 2);
댓글 수: 6
Geoff
2012년 3월 19일
Note: Edited. Needed a call to cell2mat() in the first code section. Added an alternative.
Ubu
2012년 3월 19일
Ubu
2012년 3월 19일
Ubu
2012년 3월 19일
Geoff
2012년 3월 19일
That's odd. Did you use my edited version of the first code segment? Using A{rowidx,2} was incorrect.
I assume your matrix is generally numeric (ie the numbers themselves are not strings), but those NaNs get in the way. You could try converting them to numbers too:
A{cellfun(@(x) strcmpi(x,'nan'), A)} = NaN;
Ubu
2012년 3월 19일
Aldin
2012년 3월 19일
Here, try this code:
A = [ 2 1 3 2 4; 4 5 3 6 2; 2 3 5 3 6; 1 2 5 3 6; 3 2 5 2 5]
for i = 1:5
if A(i,1) == 2
A(i,2) = 2;
end
end
댓글 수: 4
Ubu
2012년 3월 19일
Aldin
2012년 3월 19일
A(i,2) = 2; -----> "we would like to find all occurrences of number [2] in column 1, and save corresponded value in column 2 " (by Ubu).
It means to copy "2" in second column.
Aldin
2012년 3월 19일
oooo i know what you want :)
A = [ 2 1 3 2 4; 4 5 3 6 2; 2 3 5 3 6; 1 2 5 3 6; 3 2 5 2 5];
counter = 0;
for i = 1:5
if A(i,1) == 2
counter = counter + 1;
new_variable(count) = A(i,2);
end
end
Aldin
2012년 3월 19일
Have I solved your problem?
카테고리
도움말 센터 및 File Exchange에서 Data Type Identification에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!