- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下矩阵,它是对称且实数的(它是汉密尔顿运算符):(Matlab 友好)
[63.000000, -1.732051, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000; -1.732051、61.000000、-2.000000、0.000000、-1.000000、0.000000、0.000000、0.000000、0.000000、0.000000; 0.000000、-2.000000、61.000000、-1.732051、0.000000、-1.414214、0.000000、0.000000、0.000000、0.000000; 0.000000、0.000000、-1.732051、63.000000、0.000000、0.000000、-1.732051、0.000000、0.000000、0.000000; 0.000000、-1.000000、0.000000、0.000000、61.000000、-1.414214、0.000000、0.000000、0.000000、0.000000; 0.000000、0.000000、-1.414214、0.000000、-1.414214、60.000000、-1.414214、-1.414214、0.000000、0.000000; 0.000000、0.000000、0.000000、-1.732051、0.000000、-1.414214、61.000000、0.000000、-2.000000、0.000000; 0.000000、0.000000、0.000000、0.000000、0.000000、-1.414214、0.000000、61.000000、-1.000000、0.000000; 0.000000、0.000000、0.000000、0.000000、0.000000、0.000000、-2.000000、-1.000000、61.000000、-1.732051; 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, -1.732051, 63.000000]
如果我用这些值创建 JAMA 矩阵,并执行特征值分解,V*D*transpose(V) 不等于哈密尔顿。你们中有人知道出了什么问题吗?特征值与 MATLAB 一致,但特征向量不一致。
这是一个测试它的类
public class TestJama {
public static void main(String[] args) {
double[][] m = new double[][] {
{63.000000, -1.732051, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000},
{ -1.732051, 61.000000, -2.000000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000},
{ 0.000000, -2.000000, 61.000000, -1.732051, 0.000000, -1.414214, 0.000000, 0.000000, 0.000000, 0.000000},
{ 0.000000, 0.000000, -1.732051, 63.000000, 0.000000, 0.000000, -1.732051, 0.000000, 0.000000, 0.000000},
{ 0.000000, -1.000000, 0.000000, 0.000000, 61.000000, -1.414214, 0.000000, 0.000000, 0.000000, 0.000000},
{ 0.000000, 0.000000, -1.414214, 0.000000, -1.414214, 60.000000, -1.414214, -1.414214, 0.000000, 0.000000},
{ 0.000000, 0.000000, 0.000000, -1.732051, 0.000000, -1.414214, 61.000000, 0.000000, -2.000000, 0.000000},
{ 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, -1.414214, 0.000000, 61.000000, -1.000000, 0.000000},
{ 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, -2.000000, -1.000000, 61.000000, -1.732051},
{ 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, -1.732051, 63.000000}
};
Matrix hamilton = new Matrix(m);
System.out.println(jamaToString(hamilton));
EigenvalueDecomposition e = hamilton.eig();
System.out.println(jamaToString(e.getD()));
System.out.println(jamaToString(e.getV()));
Matrix recomb = e.getV().times(e.getD()).times(e.getV().transpose());
System.out.println(jamaToString(recomb));
System.out.println(hamilton.equals(recomb));
}
private static String jamaToString(Matrix m) {
StringBuilder b = new StringBuilder();
b.append("[");
for(int i=0; i<m.getRowDimension(); i++) {
for(int j=0; j<m.getColumnDimension(); j++) {
b.append(m.get(i, j));
if(j<m.getColumnDimension() - 1) b.append(",");
}
if(i<m.getRowDimension() - 1) b.append(";");
}
b.append("]");
return b.toString();
}
}
编辑:结果 (V*D*transpose(V)) 得出
63.1093 -0.6379 0.3400 -0.6576 0.0938 -0.0437 -0.6056 -0.5066 0.3463 0.5039 -0.6379 61.3082 -0.2368 -1.7813 -0.0851 0.7949 -0.1337 0.7668 -0.0422 -2.4329 0.3400 -0.2368 60.1481 1.3323 -0.4099 -1.8834 -0.5780 0.7516 0.0946 0.1705 -0.6576 -1.7813 1.3323 61.2455 0.0972 -0.8075 -0.9004 0.0242 0.3963 -1.2527 0.0938 -0.0851 -0.4099 0.0972 60.3086 -0.1899 0.0394 0.1987 -0.0484 -0.1495 -0.0437 0.7949 -1.8834 -0.8075 -0.1899 61.7941 0.3741 0.8237 0.7772 0.7557 -0.6056 -0.1337 -0.5780 -0.9004 0.0394 0.3741 60.6415 0.6351 0.7099 0.3349 -0.5066 0.7668 0.7516 0.0242 0.1987 0.8237 0.6351 62.8108 1.3507 1.3002 0.3463 -0.0422 0.0946 0.3963 -0.0484 0.7772 0.7099 1.3507 63.3270 0.1244 0.5039 -2.4329 0.1705 -1.2527 -0.1495 0.7557 0.3349 1.3002 0.1244 60.3069
最佳答案
如果只是关于矩阵的值:这是正确的。
EDIT: The above statement was written before the resulting matrix was inserted into the original question. Of course, this matrix is not correct. According to the comments, it seems that this wrong matrix was caused by some bug in an older JAMA version. With JAMA 1.0.3 it worked. The remaining part of this answer is still valid and relevant for the question nevertheless:
这里有两个问题。首先,JAMA Matrix
类的 equals
方法不会被重写来比较矩阵的内容。 equals
的默认实现会比较所引用对象的身份。所以即使是像这样的微不足道的比较
Matrix A = new Matrix(new double[][]{{1.0}});
Matrix B = new Matrix(new double[][]{{1.0}});
System.out.println(A.equals(B));
将打印false
。
第二个问题相当简单(也很常见):使用double
值进行计算并不是无限精确的。您可以在 StackOverflow 上找到许多与此相关的问题,但可能想看看 Wikipedia about Floating Point Accuracy Problems 。 (有些人会推荐关于 What Every Computer Scientist Should Know About Floating-Point Arithmetic 的文章,但它相当复杂......)。
通过这个小例子可以轻松重现基本问题:
double x = 0.1;
double y = 0;
for (int i=0; i<10; i++)
{
y += x;
}
System.out.println(y+" == 1.0: "+(y==1.0));
此计算的结果不是 y==1.0
,而是y==0.99999999999999...
。
因此,即使如果覆盖equals
方法来执行逐元素比较,由于 float ,比较仍然会产生false
点错误。
缓解此问题的一种方法是检查某些值是否“等于一个小 epsilon”。这可能仍然很棘手,因为要比较的值的大小在这里会产生影响,但一种解决方案可能是使用以下方法来比较矩阵的 epsilon 相等性:
private static boolean epsilonEqual(Matrix a, Matrix b)
{
int ra = a.getRowDimension();
int rb = b.getRowDimension();
if (ra != rb)
{
return false;
}
int ca = a.getColumnDimension();
int cb = b.getColumnDimension();
if (ca != cb)
{
return false;
}
for (int c=0; c<ca; c++)
{
for (int r=0; r<ra; r++)
{
double ea = a.get(r, c);
double eb = b.get(r, c);
if (!epsilonEqual(ea, eb))
{
return false;
}
}
}
return true;
}
private static boolean epsilonEqual(double x, double y)
{
final double epsilon = 1e-8;
return Math.abs(x - y) <= epsilon;
}
关于java - JAMA 没有计算正确的特征向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23411921/
我正在与 Jama Matrix 一起工作.我将它用于 LSI。它工作正常。但是,当我传递一个像 8000x8000 这样的大矩阵时,它会杀死我的整个系统。我只是调用 SVD,然后减小矩阵大小并相加。
当我使用 matrix.eig() 时,我得到了一个错误的特征向量(也通过运行多次来确定)。矩阵是: 1.2290 1.2168 2.8760 2.6370 2.2949 2.6402 1.2168
我正在使用 Jama API 解决线性代数问题。但它给我一个错误:java.lang.RuntimeException: Matrix is singular. 我想当矩阵是奇异矩阵时,有多种可能的解
我不熟悉将 Jama 用于矩阵。我的问题是,当我使用 det() 方法(与 LUDecomposition 类相关)时,它给出了 “Matrix must be square”。好的,我的矩阵是三角形
我有以下矩阵,它是对称且实数的(它是汉密尔顿运算符):(Matlab 友好) [63.000000, -1.732051, 0.000000, 0.000000, 0.000000, 0.000000
我正在尝试编写一段代码,允许我创建 2x2 矩阵,然后使用 JAMA 库 ( http://math.nist.gov/javanumerics/jama/ ) 来计算我刚刚创建的矩阵的特征值和特征向
首先,抱歉我的英语不好,但我需要你的帮助。 我用 java swing 开发了一个模拟程序,其中使用了大量矩阵计算。我的程序刚刚完成,但我需要加快我的表现。所以我使用了java Visual vm p
我正在使用 JAMA 进行图像处理中的一些矩阵运算。 在这里,我将矩阵与其转置相乘。肯定是有可能的。 但我收到以下错误: Exception in thread "main" java.lang.Il
我正在尝试在 Linux 的代码中使用 Jama 包。在我的主类中,我尝试使用 Matrix 类。 这是我的主要类(class): import Jama.*; class Main { pu
我有这个数组 double a[][] = {{1,1,1}, {0,1,1} , { 1,0,0} ,{0,1,0},{1,0,0},{1,0,1},{1,1,1},{1,1,1},
我想使用jama库将矩阵写入java文件。但是,只生成一个空文件。我正在使用下面的代码。可能出了什么问题? PrintWriter writer = null; try { w
我想使用 Jama 库将 2 矩阵相乘,但它返回: A col: 4 row: 4 B col: 1 row: 4 Exception in thread "AWT-EventQueue-0" jav
谁能告诉我 JAMA MATRIX 包 setMatrix 的工作原理吗?请不要建议我查看文档。我多次搜索文档,但没有得到任何其工作原理的示例。我有代码想要使用 JAMA MATRIX 包设置具有所需
我是 Java 编程的新手。我正在做一个科学模拟,其中必须求解一个线性方程组。 我在 Eclipse 中工作。我下载了 jama jar 文件并添加到 JRE 系统库中。问题是当我通过传递一个二维双数
这可能是一个有点愚蠢的问题,我也可能误解了解决这个问题的最佳方法,但我本质上想做的是: 我想将以下矩阵相乘以获得结果 -0.8。但是,理想情况下,我希望使用 JAMA 函数来执行此操作。到目前为止,我
我使用 JAMA.matrix 包..我如何打印矩阵的列 最佳答案 最简单的方法可能是 transpose矩阵,然后打印每一行。以API中的部分示例为例: double[][] vals = {{1.
关注 Jama矩阵在我的代码中定义: P: 3*3 Matrix I: 3*3 identity Matrix K: 3*2 Matrix H: 2*3 Matrix Q: 3*3 Matrix 以下
我正在尝试使用 Jama 求解 4x4 线性方程组(4 个变量,4 个方程)。我已经尝试过以下代码,但它不起作用。如果有人可以使用 Jama 或任何其他方法帮助我,我将不胜感激。 import Jam
我正在开发一个小型 Java 应用程序,用于对矩阵执行计算。这就是我现在计算方阵的行列式和逆矩阵的方法。但我想使用 Jama 类来计算特征值和特征向量,但我不知道如何使用它,有人可以帮我吗?谢谢。 i
我有一个使用 JAMA 的程序而需要测试的是一个矩阵是否可以倒置。我知道我可以尝试它并捕获异常,但这似乎是个坏主意(将 catch block 作为“正常”代码路径的一部分似乎是一种不好的形式)。 首
我是一名优秀的程序员,十分优秀!