我有数据文件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