element wise logical operators?

25 visualizzazioni (ultimi 30 giorni)
Timj2004
Timj2004 il 13 Ago 2012
I have a question regarding using logical operators on a multi-dimensional array.
I want to firstly test if an element passes a criteria then replace that value with another value given the results of a test.
I want to check the first dimension of the array against the threshold of 0.5 and replace all instances where this is true with a value for only 2 columns of the the 2nd dimension and all cases of the 3rd and 4th dimension. Does anyone know how to do this without multiple for loops?
for example
DA = rand(4,4,2,3);
if DA(:,2:4,:,:)<0.5;
DA(:,2:4,:,:) = 1;
end
thanks Tim

Risposta accettata

Azzi Abdelmalek
Azzi Abdelmalek il 14 Ago 2012
Modificato: Azzi Abdelmalek il 14 Ago 2012
clear
DA = rand(4,4,2,3);
K=arrayfun(@(x) x<0.5,DA(:,2:4,:,:))
B=DA(:,2:4,:,:);
B(find(K==1))=1;
DA(:,2:4,:,:)=B
  1 Commento
per isakson
per isakson il 14 Ago 2012
Modificato: per isakson il 14 Ago 2012
Explicitly operating on a sub array and assign it back is a good approach. However, may I propose a bit of refactoring according to Matt Fig above:
sub_array = DA(:,2:4,:,:);
sub_array( sub_array < 0.5 ) = 1;
DA(:,2:4,:,:) = sub_array;

Accedi per commentare.

Più risposte (2)

Matt Fig
Matt Fig il 13 Ago 2012
Modificato: Matt Fig il 14 Ago 2012
Do you mean this?
DA = rand(4,4,2,3);
DA(DA(:,2:4,:,:)<0.5) = 1;
or perhaps you are talking about this (see the comments below):
DA = rand(4,4,2,3);
tmp = DA(:,2:4,:,:);
tmp(tmp<.5) = 1;
DA(:,2:4,:,:) = tmp;
  3 Commenti
Matt Fig
Matt Fig il 13 Ago 2012
Modificato: Matt Fig il 13 Ago 2012
I wasn't sure whether the OP wants this or something more like:
DA = rand(4,4)
tmp = DA(:,2:4);
tmp(tmp<.5) = 1;
DA(:,2:4) = tmp
per isakson
per isakson il 14 Ago 2012
Modificato: per isakson il 14 Ago 2012
It turned out, I cannot make sense of the question. OP must help.
However, I found it very hard to grasp
M( logical_index ) = scalar;
when size(M) is not equal to size(logical_index). One dimension is ok, but four is not.
Is there a way to think about it?
OK, now I got the message: Work with sub arrays!

Accedi per commentare.


Timj2004
Timj2004 il 14 Ago 2012
Ok, it appears there is some confussion regarding the question. I appologise. and I appreciate the responses. the idea is to review 3 columns of the array and compare the value to a limit. Then replace the value of the rows in those columns with a new value.
so if my 4D array is as follows DA(simulations, components, alpha, bravo) we have the simulation results (rows) for each component (columns) at each alpha and bravo.
so I want to run a check on 3 components for all simulations and replace the output of the simulation results if it meets a logical criteria.
So DA(sims, [component2 component3 component4] , A, B). lets say DA = rand(4,4,2,2) for now.
so DA(:,2:4,:,:)>0.5 = 1; so if sims in columns 2:4 are greater than 0.5, replace those results with 1.
Thanks.
I was trying to avoid creating too many variables here since I am dealing with arrays of the magnitude of DA(2000,80,50,8) but I guess the best solution has been to use sub arrays. thanks.
"sub_array = DA(:,2:4,:,:);
sub_array( sub_array < 0.5 ) = 1;
DA(:,2:4,:,:) = sub_array;" - per isakson
-sincerely Tim

Community Treasure Hunt

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

Start Hunting!

Translated by