6

四元数比较可以吗?我正在编写一个四元数的 Java 类,我想实现Comparable接口以使用该Collections.sort(List<Quaternion>)工具。我不是数学专家,我真的不明白我读到的关于四元数的东西。那么,谁能告诉我我可以覆盖compareTo四元数的方法以及如何?

我的班级宣言:

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。但是,您需要确定您希望订单是什么样的。AFAIK,对于复数之前或之后的内容没有标准定义,更不用说四元数了。

于 2011-04-27T11:59:16.437 回答
2

你当然可以比较它们;比较是否有意义还有待商榷。由于四元数可以用四个实数表示,因此您只需执行以下操作(伪代码)

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;

由于这些值是实数,您可能会使用基于 epsilon 的比较,并且您需要将小的正负差转换为正整数和负整数。但你明白了。

于 2011-04-27T12:01:44.813 回答
1

没有理由不能比较两个四元数。假设您要比较幅度,计算并比较Quaternion Norms。您的四元数类应该有一个规范(幅度)方法,允许 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

将四元数视为四个浮点数的元组(有序列表)。定义相等非常简单,但是您如何定义总顺序?换句话说,你想如何定义两个四数序列之间的大于关系?

事实上,即使在复数和四元数之间也没有共同的大于关系,可以认为是一对复数。简单的比较只能在一维空间中进行。复数是二维的,四元数 - 四个。

于 2011-04-27T12:01:22.873 回答
0

你可以,但我认为你不应该。

参数与复数相同。给定两个四元数,它们要么相等,要么不相等,没有办法说哪个大于另一个。四元数形成一个除法代数,它是无序的(不像实数的领域)。我能想到的唯一(合理)方法是使用范数来比较两个四元数。

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

在这种情况下,您可以定义,如果 a范数大于b的范数,则四元数a大于四元数b。但这绝对不是标准定义。我会小心地使四元数或复数具有可比性。但是,这取决于您的用例。请注意,没有标准的方法来对这些数字进行排序。

有关比较复数的一些很好的链接,请参阅此google 搜索。四元数的论证基本相同。

比较四元数的另一种方法是使用字典顺序

于 2011-04-27T12:27:59.220 回答
0

四元数或复数没有数学标准排序。

尽管如此,您可能仍希望实现该Comparable接口,以便方便地排序并将它们存储在集合中TreeSetTreeMap

为了明确排序是任意的,我将使用四元数组件的字典组合。这也确保了排序与 一致equals,并且算法按预期工作。

对于更自然的排序,例如考虑规范的排序,您始终可以显式定义比较器。

于 2011-04-27T14:14:33.947 回答