2012-07-24 86 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。

享受!