C++ 用最优化方法数值求解一个矩阵方程

C++ 用最优化方法数值求解一个矩阵方程,c++,matrix,linear-algebra,lapack,armadillo,C++,Matrix,Linear Algebra,Lapack,Armadillo,给定一个复方阵G和一个方阵M,我可以从G快速计算,我需要有效地计算由矩阵方程G'定义的矩阵G'⋅ M⊤ = g>强>。之后,可以丢弃原始的G 由于我在数值线性代数方面的经验有限,到目前为止,我一直依赖于该库,该库具有非常好的语法,可以提供良好的性能。我在这里的方法是对方程两边进行转置,然后解决这个问题 M⋅ (G')⊤=G⊤通过调用 但是,如果我正确理解了大量基于模板的代码,这将涉及到在LAPACK例程中实际执行转置和复制数据。当然,与实际线性解算器的O(N3)相比,这些是O(N2)操作,但

给定一个复方阵G和一个方阵M,我可以从G快速计算,我需要有效地计算由矩阵方程G'定义的矩阵G'M = <强> g>强>。之后,可以丢弃原始的G

由于我在数值线性代数方面的经验有限,到目前为止,我一直依赖于该库,该库具有非常好的语法,可以提供良好的性能。我在这里的方法是对方程两边进行转置,然后解决这个问题 M⋅ (G'=G通过调用

但是,如果我正确理解了大量基于模板的代码,这将涉及到在LAPACK例程中实际执行转置和复制数据。当然,与实际线性解算器的O(N3)相比,这些是O(N2)操作,但在这种情况下,我还是宁愿避免它们

到目前为止,我从未直接使用过LAPACK,但是否有可能通过直接调用LAPACK例程而不必实际执行换位来获得性能?或者你会建议一种不同的方法吗



我曾经提供了一个用于LAPACK的C++代码。看看我的答案,它提供了一个关于如何使用原始Fortran库中的lapack的示例


这些矩阵有多大?如果你谈论的是大于10x10的东西,与线性解算器相比,换位可以忽略不计。没有充分的理由求助于直接的LAPACK调用。您自己也说过,与解算器相比,转置非常便宜,因此您获得的性能奖励可能太少,无法衡量,因为您的代码可读性大大降低。直接从C/C++中使用LAPACK是相当混乱的。还可以看看Egeng库:我认为他们使用了一些模板魔法,这意味着转置永远不会被实际计算,它只是为下一个操作提供了不同的访问器例程(解算器的某种分解)。我对犰狳知之甚少,但也许它们也会这样做?矩阵目前在64x64到1024x1024之间,如果我能进一步优化算法的其他部分,以后可能会更大。你是对的,在这一点上,你可以肯定的是,性能的提高是微乎其微的。这更多的是一个原则问题(可能是浪费了能量…):感觉做换位太没必要了。到底是什么原则的问题?过早优化?我只是半开玩笑;)。不过,还有一件事引起了我的注意,你说
M
可以从
G
快速计算出来。这难道不能为你的系统提供一个更简单的解决方案吗?虽然这是相关的,但我一直在寻找关于这个具体问题的lapack建议。在这个链接中,你有一本手册,你有一个关于如何解决一般矩阵的示例。恕我直言,但你到底需要什么?要我帮你解决吗?除了一个不同维度的例子,你还需要什么?我对你的回答感到很困惑。
using namespace arma;
G = trans(solve(M, trans(G));