四元数比较是否可行?我正在编写一个Java类的Quaternions,我想实现Comparable
接口来使用Collections.sort(List<Quaternion>)
工具。我不是数学专家,我真的不明白我读到的关于四元数的事情。那么,任何人都可以告诉我,我可以覆盖Quaternions的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;
}
答案 0 :(得分:2)
您可以通过比较其字段来实现compareTo。但是,您需要确定订单的内容。 AFAIK,对复杂数字之前或之后没有标准定义,更不用说四元数了。
答案 1 :(得分: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的比较,并且需要将小的正负差异转换为正整数和负整数。但是你明白了。
答案 2 :(得分:1)
没有理由不能比较两个四元数。假设您想要比较幅度,请计算并比较Quaternion Norms。你的Quaternion类应该有一个norm(幅度)方法,允许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;
}
答案 3 :(得分:1)
四元数是一种四维向量。 你想怎么订购?最合理的方法是使用标准。
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;
}
}
请注意,使用norm将使四元数相等但指向不同的方向相等,并且某些算法将无法区分它们。排序算法可能会丢掉“重复”。只是一个友好的警告。
答案 4 :(得分:0)
将四元数视为四个浮点数的元组(有序列表)。定义平等非常简单,但是如何定义总排序?换句话说,您想如何定义两个四数字序列之间的大于关系?
事实上,即使复数之间也没有常见的大于关系,四元数可以被认为是一对复数。易于比较只能在一维空间中进行。复数是二维的四元数 - 四。
答案 5 :(得分:0)
你可以,但我认为你不应该。
该参数与复数相同。给定两个四元数,它们是相同还是不相等,没有办法说哪一个大于另一个。四元数形成除法代数,它不是有序的(例如,与实数的字段不同)。我能想到的唯一(合理的)方法,比较两个四元数就是使用标准。
double norm = Math.sqrt(s*s + i*i + j*j + k*k);
在这种情况下,您可以定义,如果是 a <的规范,则四元数 a 大于四元数 b / em>大于 b 的范数。但这绝对不是一个标准的定义。我会小心地将四元数或复数相提并论。但是,这取决于您的使用案例。请注意,没有标准的方法来对这些数字进行排序。
有关比较复数的一些好链接,请参阅此google search。四元数的论证基本相同。
比较四元数的另一种方法是使用lexicographic order。
答案 6 :(得分:0)
四元数或复数没有数学标准排序。
您可能希望实现Comparable
界面,以方便排序并将其存储在TreeSet
和TreeMap
集合中。
为了明确排序是任意的,我将使用四元数组件的词典组合。这也确保了排序与equals
一致,并且算法可以按需运行。
对于更自然的排序,例如考虑规范的排序,您始终可以明确定义比较器。