Borrar filtros
Borrar filtros

Info

La pregunta está cerrada. Vuélvala a abrir para editarla o responderla.

What is wrong with this

3 visualizaciones (últimos 30 días)
S
S el 13 de Abr. de 2012
Cerrada: MATLAB Answer Bot el 20 de Ag. de 2021
I just want to create a variable to hold 5 different sets of values...
Mass_red
Any ideas??
load remove_outlier.mat
LMT = [20 25 28 32 36];
HMT = [40 40 40 40 39.5];
for k=1:5
i=1;
while(Mass(i) < LMT(k))
i=i+1;
end
j=1;
while(Mass(j) < HMT(k))
j=j+1;
end
Mass_red(k) = Mass(i:j);
end
Thanks
Note: Mass is loaded in to the workspace. It is a 3201 x 1 double. Basically, it is a vector with sequential values from 15 to 47. I suppose you could say it was 15:0.01:47

Respuestas (4)

Andrei Bobrov
Andrei Bobrov el 13 de Abr. de 2012
z = bsxfun(@times,Mass,bsxfun(@ge,Mass,LMT)&bsxfun(@lt,Mass,HMT));
Mass_red = z(any(z,2),:)';
OR [EDIT]
t = bsxfun(@ge,Mass,LMT)&bsxfun(@le,Mass,HMT);
z = bsxfun(@times,Mass,t)
Mass_red = arrayfun(@(ii)z(t(:,ii),ii),(1:size(z,2)),'un',0);
  4 comentarios
S
S el 13 de Abr. de 2012
I suppose it works but its not what I need. I dont want all these zeros padding up the vector.
Really I want like an array of vectors.
Sean de Wolski
Sean de Wolski el 13 de Abr. de 2012
triple bsxfuns!
+1

Thomas
Thomas el 13 de Abr. de 2012
To begin with:: you do not define Mass but you still use it to check its value in a while loop.
what is Mass?
EDIT
I think This is what you need
Mass=15:0.01:47;
LMT = [20 25 28 32 36];
HMT = [40 40 40 40 39.5];
for k=1:5
i=1
if (Mass(i) < LMT(k))
i=i+1
end
j=1
if (Mass(j) < HMT(k))
j=j+1
end
Mass_red(k,:) = Mass(i:j);
end
  11 comentarios
S
S el 13 de Abr. de 2012
Saying that though... your code is wrong... Mass(i:j) length should change each time since we are cutting it off at different values LMT and HMT
S
S el 13 de Abr. de 2012
It is wrong because... Mass(i) will always be less than LMT(k) and Mass (j) will always be less than HMT(k). Therefore i and j will increment only by 1 for each k.

Walter Roberson
Walter Roberson el 13 de Abr. de 2012
i:j is going to have varying range depending on the data values, so Mass(i:j) will be varying sizes. You are trying to store each iteration into a numeric array, but the iterations are not of constant size. That is going to be a problem: numeric arrays cannot have rows or columns of varying size. You are going to have to use a cell array:
Mass_red{k} = Mass(i:j);
Notice the {} instead of ()
  3 comentarios
S
S el 13 de Abr. de 2012
Any advance on this...
Clearly cells are the way forward but I cant assign a non-cell array object to a cell... How can I do this???
Walter Roberson
Walter Roberson el 13 de Abr. de 2012
That error implies that you initialized Mass_red in some code you did not show us. You need to initialize it differently for cell arrays.

Image Analyst
Image Analyst el 13 de Abr. de 2012
Instead of all that looping over i and j, why not just do
LMTIndex = find(Mass >= LMT(k), 1, 'first');
HMTIndex = find(Mass >= HMT(k), 1, 'first');
startingIndex = min([LMTIndex HMTIndex]);
endingIndex = max([LMTIndex HMTIndex]);
Mass_red{k} = Mass(startingIndex : endingIndex)

La pregunta está cerrada.

Community Treasure Hunt

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

Start Hunting!

Translated by