2012-07-24 87 views
0

我有數據文件F_j,每個數據文件都包含一個數字列表,其中包含未知的小數位數。每個文件都包含一些連續變量和 的離散測量,我想找到離散一步D_J文件F_j查找離散化步驟

一個解決方案,我能想出:每個F_j,

  • 找到數(n_j)小數位;
  • 將F_j中的每個數與10^{n_j}相乘得到整數;
  • 找到整個列表的最大公約數。

我正在尋找一個優雅的方式來找到n_j與Matlab。

另外,找到長整數列表的gcd似乎很難 - 你有什麼更好的主意嗎?

+0

每個文件只有一個數字嗎?或者文件中的所有數字在小數點後的長度是否相同? – 2012-07-24 12:48:22

+0

離散化與小數位數不一樣! – 2012-07-24 13:11:32

回答

0

查找一長串數字的gcd也不是很難。您可以按照列表大小的時間線性做到這一點。如果你幸運的話,你可以做得比線性少很多。本質上這是因爲:

gcd(a,b,c) = gcd(gcd(a,b),c) 

並且如果任一a=1b=1然後gcd(a,b)=1不管其它數目的大小。

所以,如果你有一個數字的列表xs你可以做

g = xs(1); 

for i = 2:length(xs) 
    g = gcd(x(i),g); 
    if g == 1 
    break 
    end 
end 

變量g現在存儲列表的最大公約數。

0

下面是一些示例代碼,我相信這些代碼可以幫助您獲取GCD,只要您有要查看的數字。

A = [15 30 20]; 
A_min = min(A); 
GCD = 1; 
for n = A_min:-1:1 
    temp = A/n; 
    if (max(mod(temp,1))==0) 
     % yay GCD found 
     GCD = n; 
     break; 
    end 
end 

這裏的基本概念是,默認的GCD永遠是1,因爲每個數字是由本身,當然1 =)整除。 GCD也不能大於列表中的最小數字,因此我以最小數字開始,然後取1。這是假設您已經將數字轉換爲整數形式。小數點會拋棄它!

通過使用1的模數,您正在測試以查看數字是否是整數,如果不是,您將剩下一個大於0的十進制餘數。如果您預計必須處理負數將不得不調整這個測試!

除此之外,您第一次找到一個數字,其中列表模數(mod 1)全部爲零,您找到了GCD。

享受!