0

matlab / octave forループがあり、誤ったデータとともにinfエラーメッセージが表示されます

240、120、60、30、15を取得しようとしています...すべての数値が2で除算され、その数値も2で除算されます

しかし、以下のコードは、数値が30と5に達したときに間違った値を示し、他のいくつかのコードは2で除算されません。

ang=240;
for aa=2:2:10
    ang=[ang;ang/aa];
end

240
120
60
30
40
20
10
5
30
15
7.5
3.75
5
2.5
1.25
0.625
24
12
6
3
4
2
1
0.5
3
1.5
0.75
0.375
0.5
0.25
0.125
0.0625

PS:さまざまな配列からこれらの値にアクセスするので、forループを使用して、インデックスを使用して値にアクセスできるようにしました。

4

4 に答える 4

2

あなたが始めていたゼロ除算エラー(編集で修正された)に加えて、あなたが取っているアプローチは実際にあなたが思っていることをしていません。各ステップを印刷すると、その理由がわかります。

そのアプローチの代わりに、より「MATLABの方法」を採用することをお勧めします。ベクトル化された操作を利用してループを回避します。

orig = 240;
divisor = 2.^(0:5); #% vector of 2 to the power of [0 1 2 3 4 5]
ans = orig./divisor;

output:
ans = [240 120 60 30 15 7.5]
于 2013-03-10T00:08:21.073 に答える
1

次のことを試してください。

ang=240;
for aa=1:5
  % sz=size(ang,1);
  % ang=[ang;ang(sz)/2];
    ang=[ang;ang(end)/2];
end
于 2013-03-10T00:22:56.627 に答える
0

warning: division by zeroOctaveで実行している場合は、取得する必要があります。それはほとんどすべてを言います。

ゼロで割ると、が得られますInf。あなたの再帰のために...あなたは問題を見ます。

于 2013-03-10T00:02:53.210 に答える
0

ロジックを使用して、一般化とベクトル化を同時に行うことができます。

ang=240; %Replace 240 with any positive integer you like
ang=ang*2.^-(0:log2(ang));
ang=ang(1:sum(ang==floor(ang)));

これは任意の正の整数で機能し(負の整数でも機能するようにするには、log2(ang)をlog2(abs(ang))に置き換えます)、奇数になるポイントまでベクトルを生成します。ベクトルは終了します。また、jitendraのソリューションよりも高速です。

octave:26> tic; for i=1:100000 ang=240; ang=ang*2.^-(0:log2(ang)); ang=ang(1:sum(ang==floor(ang))); end; toc;
Elapsed time is 3.308 seconds.
octave:27> tic; for i=1:100000 ang=240; for aa=1:5 ang=[ang;ang(end)/2]; end; end; toc;
Elapsed time is 5.818 seconds.
于 2013-03-16T16:20:17.887 に答える