Infinite for loop getting stuck. Creating a new column containing a variable.

Hi, I am trying to generate a new column variable within a table which is conditional on 2 other values. The for loop I am using to generate it is getting stuck, however. It is generating the right values for me but just gets stuck and goes through the column over and over again. Any help would be appreciated:
data.signal = zeros(size(data.NAPMPMIIndex));
for indx=1:numel(data.NAPMPMIIndex)
if(data.NAPMPMIIndex(indx) > 50 & data.AboveMA(indx)> 0.5)
data.signal(indx) = 0.5
elseif(data.NAPMPMIIndex(indx) > 50 & data.AboveMA(indx)< 0.5)
data.signal(indx) = -0.5
elseif(data.NAPMPMIIndex(indx) < 50 & data.AboveMA(indx)> 0.5)
data.signal(indx) = 1
else
data.signal(indx) = -1;
end
end

10 件のコメント

dpb
dpb 2019 年 8 月 27 日
What does
size(data.NAPMPMIIndex)
return? Your loop operates over all the elements of that array you created of that size, not just a column...perhaps it's just a lot more than you bargained for.
There's nothing in the above code snippet that is infinite--possibly numel(data.NAPMPMIIndex) is quite large, but it would finish eventually as long as you don't run out of memory.
There's other code we can't see obviously because otherwise have undefined variables but this isn't the problem.
The above assignments code be done w/o looping or explicit if...elseif by use of logical indexing.
nskel
nskel 2019 年 8 月 27 日
>> size(data.NAPMPMIIndex)
ans =
714 1
I tried to change this to" numel(data.NAPMPMIIndex) " but the same problem occurs. The answer to this in this case is 714
Adam Danz
Adam Danz 2019 年 8 月 27 日
Any chance we could run the code (ie, attach a mat file with all needed variables)?
dpb
dpb 2019 年 8 月 27 日
Build the array then assign to the table...
signal = zeros(size(data.NAPMPMIIndex));
indx=(data.NAPMPMIIndex(indx)>50) & (data.AboveMA(indx)>0.5);
signal(indx) = 0.5;
indx=(data.NAPMPMIIndex(indx)>50) & (data.AboveMA(indx)<0.5);
signal(indx) = -0.5;
indx=(data.NAPMPMIIndex(indx)<50) & (data.AboveMA(indx)>0.5);
signal(indx) = 1;
indx=(data.NAPMPMIIndex(indx)<50) & (data.AboveMA(indx)<0.5);
signal(indx) = -1;
data.signal(indx) =signal;
NB: You have no assignment for the case of ==50 or ==0.5
The above could be shortened somewhat by use of logical relation and calculated result for the second condition to flip sign but just translated existing logic directly verbatim.
Cris LaPierre
Cris LaPierre 2019 年 8 月 27 日
"NB: You have no assignment for the case of ==50 or ==0.5"
Actually, the else should cover all scenarios not specifically called out by one of the conditional expressions.
dpb
dpb 2019 年 8 月 27 日
編集済み: dpb 2019 年 8 月 27 日
Well, yes, but I doubt if that's what OP intended it to do given the other three conditions. I should, I suppose, have made that "explicit assignment"
nskel
nskel 2019 年 8 月 29 日
The answer from Andrei solves it!
... but still a bit irked why the original methodology isn't working. Code and variables attached...
dpb
dpb 2019 年 8 月 29 日
It is working; you just left off the trailing ";" after a couple of the assignment lines in the code so it's doing as you ask and echoing the whole table out each iteration that one of those conditionals is executed.
Add the missing semicolons and all will be quiet...
I ran the code in your question using the data attached to your comment above. The loop is not getting stuck nor is it repeating the same column as you described. The loop runs as it should.
To confirm that, run this version below. The the only differences are
  • semicolons are used to suppress unnecessary output.
  • a counter "c" is used to count each iteration of the for-loop and the count is displayed so you can visually confirm that the loop has the expected 714 iterations.
load spxpmi2
data.signal = zeros(size(data.NAPMPMIIndex));
c = 0;
for indx=1:714
c = c+1;
disp(c)
if(data.NAPMPMIIndex(indx) > 50 & data.AboveMA(indx)> 0.5)
data.signal(indx) = 0.5;
elseif(data.NAPMPMIIndex(indx) > 50 & data.AboveMA(indx)< 0.5)
data.signal(indx) = -0.5;
elseif(data.NAPMPMIIndex(indx) < 50 & data.AboveMA(indx)> 0.5)
data.signal(indx) = 1;
else
data.signal(indx) = -1;
end
end
nskel
nskel 2019 年 8 月 29 日
ah, thanks very much.
I'm quite new to this but that is very much a rookie error
:-)

サインインしてコメントする。

 採用された回答

Andrei Bobrov
Andrei Bobrov 2019 年 8 月 27 日
kk = [data.NAPMPMIIndex > 50, data.AboveMA > .5];
g = findgroups(kk(:,1),kk(:,2));
a = [-1;1;-.5;.5];
data.signal = a(g);

3 件のコメント

dpb
dpb 2019 年 8 月 27 日
Nicely done! Hadn't thought of the findgroups route.
nskel
nskel 2019 年 8 月 29 日
That's great! Works perfectly!
Andrei Bobrov
Andrei Bobrov 2019 年 8 月 30 日
Hi Nskel! Maybe we will accept this answer, huh? Excuse me.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File ExchangeHistorical Contests についてさらに検索

製品

タグ

質問済み:

2019 年 8 月 26 日

コメント済み:

2019 年 8 月 30 日

Community Treasure Hunt

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

Start Hunting!

Translated by