找到离散步骤

时间:2012-07-24 12:42:24

标签: matlab math

我有数据文件F_j,每个都包含一个带有未知小数位数的数字列表。每个文件包含一些连续变量的离散化测量值 我想找到文件F_j的离散化步骤d_j

我能提出的解决方案:对于每个F_j,

  • 找到小数位数(n_j);
  • 将F_j中的每个数字乘以10 ^ {n_j}以获得整数;
  • 找到整个列表中最大的公约数。

我正在寻找一种使用Matlab找到n_j的优雅方法。

另外,找到一长串整数的gcd似乎很难 - 你有更好的想法吗?

2 个答案:

答案 0 :(得分: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现在将存储列表的gcd。

答案 1 :(得分: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。

享受!