Info

此问题已关闭。 请重新打开它进行编辑或回答。

What is wrong with this

3 次查看(过去 30 天)
S
S 2012-4-13
关闭: MATLAB Answer Bot 2021-8-20
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

回答(4 个)

Andrei Bobrov
Andrei Bobrov 2012-4-13
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 个评论
S
S 2012-4-13
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 2012-4-13
triple bsxfuns!
+1

Thomas
Thomas 2012-4-13
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 个评论
S
S 2012-4-13
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 2012-4-13
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 2012-4-13
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 个评论
S
S 2012-4-13
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 2012-4-13
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 2012-4-13
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!

Translated by