0

我有一个 matlab/octave for 循环,它给我一个inf错误消息以及不正确的数据

我试图得到240,120,60,30,15 ......每个数字都除以 2 然后该数字也除以 2

但是当数字达到 30 和 5 时,下面的代码给了我错误的值,而其他几个它没有被二除。

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

You should be getting warning: division by zero if you're running it in Octave. That says pretty much everything.

When you divide by zero, you get Inf. Because of your recursion... you see the problem.

于 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 回答