find a value & store in new variable (again)

29 Ansichten (letzte 30 Tage)
Ubu
Ubu am 19 Mär. 2012
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

Antworten (3)

Geoff
Geoff am 19 Mär. 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 Kommentare
Ubu
Ubu am 19 Mär. 2012
Geoff that's so kind of you.. We'll be waiting!
Aldin
Aldin am 19 Mär. 2012
@Geoff: How do you mean?

Melden Sie sich an, um zu kommentieren.


Geoff
Geoff am 19 Mär. 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 Kommentare
Geoff
Geoff am 19 Mär. 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
Ubu am 19 Mär. 2012
A{cellfun(@(x) strcmpi(x,'nan'), A)} = NaN; right hand side has too few values to satisfy the left hand side.
However, we managed to delete those NaN, transform to mat and execute our mean and SD calculations.
It was a real pleasure to have you. You made a couple of guys very happy tonight.
We thank you very much Geoff!

Melden Sie sich an, um zu kommentieren.


Aldin
Aldin am 19 Mär. 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 Kommentare
Aldin
Aldin am 19 Mär. 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
Aldin am 19 Mär. 2012
Have I solved your problem?

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Weather and Atmospheric Science finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by