フィルターのクリア

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