6

クォータニオン比較は可能ですか? Comparableクォータニオンの Java クラスを作成しており、この機能を使用するためのインターフェイスを実装したいと考えていますCollections.sort(List<Quaternion>)。私は数学の専門家ではありません。クォータニオンについて読んだことを本当に理解していません。compareToでは、 Quaternions のメソッドをオーバーライドする方法を教えてもらえますか?

私のクラス宣言:

public class Quaternion implements Serializable, Comparable<Quaternion> {

    private double s; // scalar part
    private double i, j, k; // vectorel part


    public Quaternion() {
        super();
    }

    public Quaternion(double s, double i, double j, double k) {
        super();
        this.s = s;
        this.i = i;
        this.j = j;
        this.k = k;
    }
4

7 に答える 7

2

フィールドを比較することで、compareTo を実装できます。ただし、順序をどのようにするかを決定する必要があります。私の知る限り、四元数は言うまでもなく、複素数の前後に何が来るかについての標準的な定義はありません。

于 2011-04-27T11:59:16.437 に答える
2

確かにそれらを比較できます比較に意味があるかどうかは議論の余地があります。四元数は 4 つの実数で表すことができるので、次のようにします (疑似コード)。

if (q1.a != q2.a)
    return q1.a - q2.a;
else if (q1.b != q2.b)
    return q1.b - q2.b;
else if (q1.c != q2.c)
    return q1.c - q2.c;
else
    return q1.d - q2.d;

値は実数であるため、イプシロン ベースの比較を使用する場合があり、小さな正と負の差を正と負の整数に変換する必要があります。しかし、あなたはその考えを理解します。

于 2011-04-27T12:01:44.813 に答える
1

2 つの四元数を比較できない理由はありません。マグニチュードを比較したい場合、Quaternion Normsを計算して比較します。Quaternion クラスには、 toCompare を次のようにできるようにするノルム (マグニチュード) メソッドが必要です。

int compareTo(Quaternion o){
  return (int)(this.norm() - o.norm());
}

より良いバージョンは次のとおりです。

int compareTo(Quaternion o){
  // return (int)(this.norm() - o.norm());
  double tNorm = this.norm;
  double oNorm = o.norm;
  int retVal = 0;

  if (tNorm < oNorm){
    retVal = -1;
  } else if (tNorm > oNorm){
    retVal = 1;
  }

  return retVal;
}
于 2011-04-27T12:01:06.960 に答える
1

クォータニオンは一種の 4 次元ベクトルです。どのように注文しますか? 最も合理的な方法は、標準を使用することです。

public int compareTo(Object o) {
  if (o instanceOf Quaternion) {
    // Compute the difference between the square of the norm
    double result = s*s + i*i + j*j + k*k - o.s*o.s - o.i*o.i - o.j*o.j - o.k*o.k;
    if (result > 0) { return 1; }
    if (result < 0) { return -1; }
    return 0;
  }
}

ノルムを使用すると、同じ長さのクォータニオンが異なる方向を指すようになり、一部のアルゴリズムではそれらを区別できないことに注意してください。ソートアルゴリズムは、「重複」を捨てる可能性があります。フレンドリーな警告です。

于 2011-04-27T12:13:57.017 に答える
0

四元数または複素数の数学的標準順序はありません。

それにもかかわらず、便利な並べ替えとコレクションComparableへの保存のために、インターフェイスを実装したい場合があります。TreeSetTreeMap

順序付けが任意であることを明確にするために、四元数のコンポーネントの辞書式の組み合わせを使用します。これにより、順序が と一致しequals、アルゴリズムが期待どおりに機能することも保証されます。

ノルムを考慮した順序付けなど、より自然な順序付けを行うには、いつでもコンパレータを明示的に定義できます。

于 2011-04-27T14:14:33.947 に答える
0

クォータニオンを 4 つの浮動小数点数のタプル (順序付きリスト) と考えてください。平等を定義するのはとても簡単ですが、全秩序をどのように定義しますか? 言い換えれば、2 つの 4 つの数列の間の大なり関係をどのように定義したいのでしょうか?

実際、複素数の間にも一般的な大なり関係はなく、四元数は複素数のペアと見なすことができます。単純な比較は、1 次元空間でのみ可能です。複素数は 2 次元の四元数 - 4 です。

于 2011-04-27T12:01:22.873 に答える
0

できますが、そうすべきではないと思います。

引数は複素数の場合と同じです。2 つのクォータニオンが与えられた場合、それらは等しいか等しくないかのどちらかであり、どちらが他方よりも大きいとは言えません。四元数は、順序付けされていない除算代数を形成します (たとえば、実数の体とは異なります)。私が考えることができる唯一の (合理的な) 方法は、ノルムを使用することです。

double norm = Math.sqrt(s*s + i*i + j*j + k*k);

その場合、aのノルムがbのノルムよりも大きい場合、四元数aは四元数bよりも大きいと定義できます。しかし、それは間違いなく標準的な定義ではありません。四元数や複素数を比較できるようにするには注意が必要です。ただし、ユースケースによって異なります。そのような数値をソートする標準的な方法がないことを考慮してください。

複素数の比較に関する適切なリンクについては、このGoogle 検索を参照してください。四元数の議論は基本的に同じです。

四元数を比較する別の方法は、辞書式順序を使用することです。

于 2011-04-27T12:27:59.220 に答える