find a value & store in new variable (again)
Show older comments
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
Answers (3)
Geoff
on 19 Mar 2012
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 Comments
Aldin
on 19 Mar 2012
Look at my answer it is same as yours
Geoff
on 19 Mar 2012
No, it isn't.
Aldin
on 19 Mar 2012
How?
Aldin
on 19 Mar 2012
Please explain
Ubu
on 19 Mar 2012
Aldin
on 19 Mar 2012
Which is the correct answer. Please press 'Accept answer' that we know that's the question closed successfully
Geoff
on 19 Mar 2012
@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
on 19 Mar 2012
@Geoff: Yes, but Your code is not exactly clear for beginners in MATLAB.
Ubu
on 19 Mar 2012
Ubu
on 19 Mar 2012
Geoff
on 19 Mar 2012
@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
on 19 Mar 2012
Aldin
on 19 Mar 2012
@Geoff: How do you mean?
Geoff
on 19 Mar 2012
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 Comments
Geoff
on 19 Mar 2012
Note: Edited. Needed a call to cell2mat() in the first code section. Added an alternative.
Ubu
on 19 Mar 2012
Ubu
on 19 Mar 2012
Ubu
on 19 Mar 2012
Geoff
on 19 Mar 2012
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
on 19 Mar 2012
Aldin
on 19 Mar 2012
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 Comments
Ubu
on 19 Mar 2012
Aldin
on 19 Mar 2012
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
on 19 Mar 2012
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
on 19 Mar 2012
Have I solved your problem?
Categories
Find more on Data Type Identification 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!