0

我正在使用这个函数来获取一个列向量,其中每个元素都应该是 1,但是在 n 变大之后,有时某些元素不是 1,这是由于方法限制,我想找出 n 有多大并返回值。问题是: 1.似乎 1 存储为 1.0000,不知道如何转换它,以及如何比较(注释中的位置) 2.不知道如何完全退出循环。谢谢你。

function x = findn(n)

for m = 1:n
    [a,b]=Hilbert(m);
    m1 = GaussNaive(a,b);
    m2 = size(m1,1);
    % m1 is a n*1 matrix (a column vector) which every element is supposed 
    % to be 1, but when n gets large, some element is not 1.
    for i = 1:m2
        if (m1(i) ~= 1)
        % this compare isn't really working, since 1 is stored as 1.0000 for whatever
        % for whatever reason and they are not equal or not not equal.
        % I doubt whether it really compared.
        x = m;
        break;
        % it just exit the inner for loop, not entirely
        end
    end
end
4

1 回答 1

0

在 Matlab 中,所有数值变量默认都是双精度浮点数。(实际上字符串和逻辑也可以看起来像 fp 数,但暂时忘记这一点。)因此,除非您采取代码未显示的步骤,否则您正在使用 fp 数。您可以采取的步骤包括将变量声明为具有特定类型,例如int32or uint16,并注意对它们执行的算术运算。Matlab 对双精度浮点的吸引力非常强,并且很容易对ints 进行操作(例如)并再次以浮点数结束。开始阅读文档中的这些类型。

避免对 fp 数进行(不)等式测试的原因几乎每天都在 SO 上进行解释,我不会重复它们,看看周围。修改代码的直接方法是将测试替换为

if (m1(i) ~= 1)

if ((abs(m1(i)-1)>tol)

其中是一些小的数字,因此对于您的目的tol,任何大于1+tol(或小于1-tol)的数字都被视为不等于。1

不幸的是,据我所知,Matlab 缺少break从内部循环到包含循环外部的语句。但是,在这种情况下,您可能可以将控制权替换为breaka return,它将控制权返回给调用您的函数的函数,或者如果您从那里调用它,则返回给命令行。

于 2013-02-16T08:23:25.797 回答