element wise logical operators?

23 visualizaciones (últimos 30 días)
Timj2004
Timj2004 el 13 de Ag. de 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

Respuesta aceptada

Azzi Abdelmalek
Azzi Abdelmalek el 14 de Ag. de 2012
Editada: Azzi Abdelmalek el 14 de Ag. de 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 comentario
per isakson
per isakson el 14 de Ag. de 2012
Editada: per isakson el 14 de Ag. de 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;

Iniciar sesión para comentar.

Más respuestas (2)

Matt Fig
Matt Fig el 13 de Ag. de 2012
Editada: Matt Fig el 14 de Ag. de 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 comentarios
Matt Fig
Matt Fig el 13 de Ag. de 2012
Editada: Matt Fig el 13 de Ag. de 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 el 14 de Ag. de 2012
Editada: per isakson el 14 de Ag. de 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!

Iniciar sesión para comentar.


Timj2004
Timj2004 el 14 de Ag. de 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

Categorías

Más información sobre Logical en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by