我有一个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循环所以我可以使用它们的索引访问这些值
答案 0 :(得分: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]
答案 1 :(得分:1)
尝试以下方法:
ang=240;
for aa=1:5
% sz=size(ang,1);
% ang=[ang;ang(sz)/2];
ang=[ang;ang(end)/2];
end
答案 2 :(得分:0)
如果你在Octave中运行它,你应该得到warning: division by zero
。这几乎说明了一切。
当你除以零时,得到Inf
。因为你的递归...你看到了问题。
答案 3 :(得分: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替换log2(ang)(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.