本征复矩阵-向量乘法

时间:2020-01-05 17:54:22

标签: c++ eigen

我有这些本征复矩阵:

Eigen::MatrixXcd matrix;
Eigen::VectorXcd rhs;
Eigen::VectorXcd solution;

我可以成功加载值并计算解决方案,但是如果尝试:

rhs = matrix*solution;

我在Eigen文件GeneralProduct.h和CxRealAbs.h中遇到与重载“ + =”运算符和双/复杂转换有关的编译器错误

尝试计算残差的类似问题。

帮助??

谢谢

凯文

2 个答案:

答案 0 :(得分:0)

根据他们的文档,Eigen检查操作的有效性:

操作有效性 本征检查您执行的操作的有效性。如果可能,它将在编译时检查它们,从而产生编译错误。这些错误消息可能很长很丑,但是Eigen将重要消息写在UPPERCASE_LETTERS_SO_IT_STANDS_OUT中。例如:

Matrix3f m;
Vector4f v;
v = m*v;      // Compile-time error: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES

当然,在许多情况下,例如,在检查动态大小时,无法在编译时执行检查。然后,本征使用运行时断言。这意味着如果在“调试模式”下运行该程序,则在执行非法操作时该程序将中止并显示一条错误消息,并且如果断言被关闭,它可能会崩溃。

MatrixXf m(3,3);
VectorXf v(4);
v = m * v; // Run-time assertion failure here: "invalid matrix product"

Eigen

您的RHS是一个向量,您正尝试从矩阵和向量积中为其分配一个值或一组值。即使从数学角度来看,您也应该问自己这是否是有效的操作类型。

请考虑MN是矩阵,而AB是向量,这些运算的结果是:

M = AB // Cross product and not a dot product
M = AM, MA, BM, MB // yields a transformed matrix using the original matrix
M = AN, NA, BN, NB // yields a transformed matrix using a supplied matrix

A = AA, AB, BA // cross product and not the dot product

A = AM, MA, AN, NA, BM, MB, BN, NB // yields what? 

因此在Eigen进行编译时,它正在检查运算符的有效性,因此,这给您带来编译时错误,即未定义+=且未提供其中一个的重载版本。它根本不知道如何执行预期的操作。 matrixvector类的基础类型是什么都没关系。这与您试图执行的运算符未在某处定义的事实有关。


修改

这里是描述矩阵和向量乘法的链接。直观上,我们假定这会产生一个向量,但是对此有一个隐含的理解,但是从矩阵的角度来看,该向量可以是行或列,以便返回的向量可以是1xM或{{1} }矩阵。

这里是显示不同解释的链接,即使它们将返回相同的结果:可以在文档的Mx1部分找到:Maxtrix-Vector Product

尽管两种不同的解释提供的最终结果相同,但它们的操作次数却有所不同。如果没有明确说明应该是行还是列乘积,则可能导致某种类型的歧义。我不知道Eigen如何确定将使用哪种方法,我假设它将选择操作最少,计算量最少的方法。

这不是您遇到的主要问题。最终,编译器仍会生成一条错误消息,指出未定义重载的运算符。我不知道这在您的代码中来自哪里。因此,当尝试在其3.2.3类型的版本上执行操作时,这可能在它们的库中。如果无法运行和编译完整的源代码,那么我将无法轻松确定究竟是什么在生成此编译器错误,并且我也不知道您使用的是哪个编译器在生成您的错误。

答案 1 :(得分:0)

问题出在我身上。我已经将* operator for std :: complex * real重载了,因为某些较早的std版本不完整。列出的第一个错误是发生在Eigen身上,这使我误入歧途。

GeneralProduct.h(287):没有可行的重载'+ ='

CxRealAbs.h(111):无法将'const Eigen :: Map,-1,1,0,-1,1>,1,Eigen :: Stride <0,0>>'转换为'double'而没有转换

消除我的过载,它可以编译并正常运行。本征动态矩阵没问题。

感谢您的答复。

凯文