2013-02-16 35 views
0

我使用這個函數來獲得一個列向量,其中每個元素應該是1, ,但是在n變大後,有時某個元素不是1,這是由於方法約束,我想知道n有多大並返回值。問題是:1.似乎1存儲爲1.0000,不知道如何轉換它,以及如何比較(註釋中的位置)2.不知道如何完全退出循環。謝謝。在matlab退出整個循環和更多

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 

回答

0

在Matlab中,所有數字變量默認都是雙精度浮點數。 (實際上,字符串和邏輯也可能看起來像f-p數字,但暫時忘記了這一點)。因此,除非您採取措施,否則您的代碼無法顯示,您正在使用f-p數字。您可以採取的步驟包括聲明您的變量具有特定類型,如int32uint16,並注意您對它們執行的算術運算。 Matlab對雙精度浮點的吸引力非常強,並且很容易在int s上運行(例如),最後再以浮點數結束。開始閱讀文檔中的這些類型。

對於f-p數字避免(不)(平等)測試的原因幾乎每天都在這裏解釋,所以我不會再重複一遍,四處看看。修改代碼的簡單方法是用

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

其中tol是一些小的數目,使得任何數量大於1+tol(或小於1-tol)是爲替換

if (m1(i) ~= 1) 

測試被認爲不等於1爲您的目的。

不幸的是,據我所知,Matlab缺少從內循環到包含循環之外的break的聲明。但是,在這種情況下,您可能可以用return代替break,它將控制權返回給調用函數的函數,或者如果您從那裏調用該函數,則返回到命令行。