- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个中等大小的Ax = b
我想解决的问题。矩阵A是600x600
.
我的代码解决了该问题,但需要花费异常长的时间。因此,我尝试检查(使用 System.currentTimeMillis()
)以查看我的代码在哪里变慢。
事实证明,在A的计算过程中,我执行了命令A = L1 * A0 * L1.transpose()
。该过程几乎消耗了该行总时间的 100%。
奇怪的是,L1 是 600x600
单位矩阵(即 A[i,j] = 1
,如果 i == j
和 0
,否则)。因此,这行代码实际上不应该花费那么长时间来执行。这个问题应该也很容易绕过
如果我尝试通过注释掉该行并将其替换为 A = A0
来绕过该行,就会发生更奇怪的事情。 。然后代码执行的时间太长(是我杀死它的原始时间的 10 倍)。而且CPU使用率达到100%。
我查了一下,结果是A
和L1 * A0 * L1.transpose()
是相同的。
总而言之,使用我的部分 Java 代码(我使用 ojalgo 库来处理矩阵):
// PrimitiveMatrix A0, L1, b are already calculated.
long startTime = System.currentTimeMillis();
System.out.println((System.currentTimeMillis() - startTime0) / 1000.0); // this prints about 2 seconds, concerning calculations of A0, L1, b.
PrimitiveMatrix A = L1.multiply(A0).multiply((L1).transpose());
System.out.println((System.currentTimeMillis() - startTime0) / 1000.0); // this prints about 67 seconds
// PrimitiveMatrix A = A0; // if this is NOT a comment, then the code has not run after (10+)x my "normal" time
final PrimitiveMatrix x = (A.invert()).multiply(b);
System.out.println((System.currentTimeMillis() - startTime0) / 1000.0); // this prints about 69 seconds
// I checked that
// A0.equals(L1.multiply(A0).multiply((L1).transpose())
// returns true
整个过程大约需要 69 秒,其中 65 秒被消耗在琐碎的计算中,我无法绕过。过去,对于较小的矩阵 (60x60),相同的过程已成功运行。
我不太确定如何继续进行调试尝试。任何帮助将不胜感激。
问题似乎比我最初估计的要深一些。我尝试打印这些矩阵以便上传它们,但随后出现了另一个问题。我发现我的代码在第一次运行 System.out.println(A0.get(aRow,aColumn));
时崩溃了。 A0
是通过将 double 类型的数字添加到维度为 600x600
的零矩阵的每个位置来创建的。此外,还会出现以下消息:
Exception in thread "main" java.lang.StackOverflowError
at org.ojalgo.matrix.store.SuperimposedStore.get(SuperimposedStore.java:84)
at org.ojalgo.matrix.store.SuperimposedStore.get(SuperimposedStore.java:84)
at org.ojalgo.matrix.store.SuperimposedStore.get(SuperimposedStore.java:84)
...
我想再次强调,当这些矩阵为 60x60
时,相同的进程可以正常运行。 。
最佳答案
我假设您正在使用 BasicMatrix#add(int,int,Number)
您是否调用该方法 600x600 次来构建矩阵?你不应该这样做!
在新版本的 ojAlgo 中,该方法已被删除,因为它经常被误解/误用。
您应该阅读以下内容:https://github.com/optimatika/ojAlgo/wiki/Getting-Started
关于java - 调试:使用 Java、ojalgo 进行线性代数计算时出现异常运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39578096/
寻找一个函数来从矩阵或密集存储的所有元素中添加/减去 double 值。 最佳答案 一些替代方案: matrixA.operateOnAll(ADD.second(scalarB)).supp
我一直在与ojAlgo玩耍,到目前为止,我对此感到非常激动。我已经对其进行了一些研究,但是使用problem described in this article遇到了麻烦。 我使用的是Kotlin而不
在 java 库 ojAlgo 中,如何对矩阵进行切片或从现有矩阵中提取子矩阵? 例如,矩阵 A = [[1,2,3],[4,5,6],[7,8,9]]。 我正在寻找一种类似于 slice(a,b,c
我对线性编程还很陌生,我确实用 lpsolve 解决了我的第一个问题(从 Java 调用二进制 dll,通过 JavaILP 包装器获得更面向对象的代码),而且速度非常快(50 毫秒)。 然后,我决定
我正在使用 ojalgo 在 java 中解决 (NxN) Ax = b 系统。由于 A 有可能是奇异矩阵,我希望我的代码以某种方式知道这一点。有办法吗? (文档指出,如果问题不合格并且 invert
有没有一种方法可以计算沿矩阵的列或行的原始元素的平均值,以便我们获得具有平均值的 vector ? 例如,让 A = [[1, 2, 3],[4, 5, 6]] 是一个2x3矩阵。列平均值将在 3 元
我正在使用ojAlgo解决我正在做的练习中的类安排问题。可以在GitHub上的kotlin_solution文件夹中找到源代码: https://github.com/thomasnield/opti
谁能告诉我如何在ojAlgo中将两个矩阵的相应元素相乘?寻找 c[i][j] = a[i][j] * b[i][j] 的 block 函数 最佳答案 有几种方法可以做到这一点。这是一种替代方案: ma
我正在尝试使用 Ojalgo 求解 M (NxN) 线性系统 (Ax = B, B = [b1,b2,...bM])。感谢apete的建议,我成功地检查了A(A,B是PrimitiveMatrix类型
我试图了解如何使用 ExpressionsBasedModel 类来解决最小二乘问题并构造一个最小问题,但我没有获得我期望的结果。我的玩具问题是最小化 f(x) = (x - 4)^2 关于x。很容易
最近,我开始使用ojAlgo库。您可以通过http://ojalgo.org/index.html获取更多信息。 但是,当我尝试使用它时遇到了问题。问题是当我想从雅虎财经检索股票数据时,股票日期和股票
我目前有一个 SparseStore 矩阵,我在上面执行大量计数和计算。我想将它存储到文件中,这样我以后就可以重用它而无需重新进行之前的所有计算。 我尝试了 Java 中的基本序列化: ObjectO
我正在尝试使用 ojAlgo解决Java中的一些线性代数问题。我想问是否有任何“聪明”的方法可以使用现有数组创建矩阵。 这是我天真的做法: final double[][] myArray = {
我正在尝试使用 Ojalgo 求解 M (NxN) 线性系统 (Ax = B, B = [b1,b2,...bM])。做到这一点最有效的方法是什么?我还想知道 A 是否是单数(A、B 是 Primit
我有一个中等大小的Ax = b我想解决的问题。矩阵A是600x600 . 我的代码解决了该问题,但需要花费异常长的时间。因此,我尝试检查(使用 System.currentTimeMillis() )
在 ojalgo 中对 m x n 矩阵 A 进行 QR 或 SVD 分解时,我遇到了障碍。我的目的是找到列零空间的基础。如果 m >= n,则一切正常。例如,对秩为 2 的 5 x 4 矩阵 A 的
我有一个二次规划问题(具有线性约束、整数变量的二次目标函数),我想用 Java 来解决。 ojAlgo 似乎能够做到这一点。不幸的是,我找不到如何使用它的文档或示例。有人可以帮我吗? 也欢迎使用 oj
commons-math3 和 ojalgo 库之间的 SVD 差异非常大。有什么方法可以减少基于任何输入参数的差异。 double[][] olsColumns = { { 1.0,
我是一名优秀的程序员,十分优秀!