【问题标题】:find discretization steps找到离散化步骤
【发布时间】:2012-07-24 21:20:29
【问题描述】:

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

我可以想出的解决方案:对于每个 F_j,

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

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

另外,找到一长串整数的 gcd 似乎很难——你有什么更好的主意吗?

【问题讨论】:

  • 每个文件只有一个数字吗?还是文件中的所有数字在小数点后都是相同的长度?
  • 离散化不等于小数位数!

标签: matlab math


【解决方案1】:

找到一长串数字的 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。

【讨论】:

    【解决方案2】:

    这里有一些示例代码,我相信一旦您获得想要查看的数字,它们会帮助您获得 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-08-18
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多