我有數據文件F_j,每個數據文件都包含一個數字列表,其中包含未知的小數位數。每個文件都包含一些連續變量和 的離散測量,我想找到離散一步D_J文件F_j查找離散化步驟
一個解決方案,我能想出:每個F_j,
- 找到數(n_j)小數位;
- 將F_j中的每個數與10^{n_j}相乘得到整數;
- 找到整個列表的最大公約數。
我正在尋找一個優雅的方式來找到n_j與Matlab。
另外,找到長整數列表的gcd似乎很難 - 你有什麼更好的主意嗎?
我有數據文件F_j,每個數據文件都包含一個數字列表,其中包含未知的小數位數。每個文件都包含一些連續變量和 的離散測量,我想找到離散一步D_J文件F_j查找離散化步驟
一個解決方案,我能想出:每個F_j,
我正在尋找一個優雅的方式來找到n_j與Matlab。
另外,找到長整數列表的gcd似乎很難 - 你有什麼更好的主意嗎?
查找一長串數字的gcd也不是太很難。您可以按照列表大小的時間線性做到這一點。如果你幸運的話,你可以做得比線性少很多。本質上這是因爲:
gcd(a,b,c) = gcd(gcd(a,b),c)
並且如果任一a=1
或b=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
現在存儲列表的最大公約數。
下面是一些示例代碼,我相信這些代碼可以幫助您獲取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。
享受!
每個文件只有一個數字嗎?或者文件中的所有數字在小數點後的長度是否相同? – 2012-07-24 12:48:22
離散化與小數位數不一樣! – 2012-07-24 13:11:32