Info

This question is closed. Reopen it to edit or answer.

What is wrong with this

1 view (last 30 days)
S
S on 13 Apr 2012
Closed: MATLAB Answer Bot on 20 Aug 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

Answers (4)

Andrei Bobrov
Andrei Bobrov on 13 Apr 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 Comments
S
S on 13 Apr 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 on 13 Apr 2012
triple bsxfuns!
+1

Thomas
Thomas on 13 Apr 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 Comments
S
S on 13 Apr 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 on 13 Apr 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 on 13 Apr 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 Comments
S
S on 13 Apr 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 on 13 Apr 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 on 13 Apr 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)

Community Treasure Hunt

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

Start Hunting!