50 views (last 30 days)

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

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

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.

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);

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

Start Hunting!