0

データファイルF_jがあり、それぞれに小数点以下の桁数が不明な数値のリストが含まれています。各ファイルには、いくつかの連続変数の離散化された測定値が含まれています。ファイルF_jの離散化ステップd_jを見つけたいと思います。

私が思いつくことができる解決策:各F_jについて、

  • 小数点以下の桁数(n_j)を見つけます。
  • F_jの各数値に10^{n_j}を掛けて、整数を取得します。
  • リスト全体の最大公約数を見つけます。

Matlabでn_jを見つけるためのエレガントな方法を探しています。

また、整数の長いリストのgcdを見つけるのは難しいようです—もっと良いアイデアはありますか?

4

2 に答える 2

0

数字の長いリストの 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 を格納します。

于 2012-07-24T13:18:18.130 に答える
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 より大きい 10 進数の剰余が残ります。このテスト!

それ以外では、リストのモジュラス (mod 1) がすべてゼロである数値を初めて見つけたときに、GCD が見つかりました。

楽しみ!

于 2012-07-24T13:20:29.937 に答える