从值的划分产生的NaN放置了Vector

时间:2014-02-07 23:23:21

标签: matlab

下面是一些MATLAB代码,它位于循环内,每个循环递增position。但是,在运行此代码后,向量F1中的值全部为NaN。我将A打印到屏幕上,然后输出预期值。

    % 500 Hz Bands
    total_energy = sum(F(1:(F_L*8)));
    A =  (sum(F(1:F_L))) /total_energy %% correct value printed to screen

    F1(position) = (sum(F(1:F_L))) /total_energy;

感谢任何帮助

2 个答案:

答案 0 :(得分:1)

假设F_L = position * interval,我建议你使用类似的东西:

cumulative_energy_distribution = cumsum(abs(F).^2);
positions = 1:q;
F1 = cumulative_energy_distribution(positions * interval) ./ cumulative_energy_distribution(positions * 8 * interval);

平方和,即能量密度(也见于Parseval定理中)是单调递增的,因此您不必担心能量会回落到零。

答案 1 :(得分:1)

在MATLAB中,如果将零除零,则得到NaN。因此,总是更好地在分母中添加无穷小数字,使得它的加法不会改变最终结果,但它避免了除零。您可以选择任何小值作为无穷小数字(例如10 ^ -10),但MATLAB已经有一个名为eps的变量。

eps(n)给出了可以在MATLAB中表示的下一个最大数字(其精度与n相同)的距离。例如,如果n=1,您可以从1获得的下一个双精度数字是1+eps(1)=1+2.2204e-16。如果n=10^10,则下一个数字为10^10+1.9073e-06epseps(1)=2.2204e-16相同。添加eps不会更改输出并避免出现0/0

的情况