C++ 特征复矩阵向量乘法

C++ 特征复矩阵向量乘法,c++,eigen,C++,Eigen,我有这些特征复矩阵: Eigen::MatrixXcd matrix; Eigen::VectorXcd rhs; Eigen::VectorXcd solution; 我可以成功加载值并计算解决方案,但如果我尝试: rhs = matrix*solution; 我在特征文件GeneralProduct.h和CxRealAbs.h中得到了与重载“+=”运算符和双/复数转换相关的编译器错误 试图计算残差也存在类似的问题 有没有 帮助 谢谢 Kevin根据他们的文件,Eigen检查操作的有效性:

我有这些特征复矩阵:

Eigen::MatrixXcd matrix;
Eigen::VectorXcd rhs;
Eigen::VectorXcd solution;
我可以成功加载值并计算解决方案,但如果我尝试:

rhs = matrix*solution;
我在特征文件GeneralProduct.h和CxRealAbs.h中得到了与重载“+=”运算符和双/复数转换相关的编译器错误

试图计算残差也存在类似的问题

有没有

帮助

谢谢


Kevin

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

业务的有效性 Eigen检查您执行的操作的有效性。如果可能,它会在编译时检查它们,从而产生编译错误。这些错误消息可能又长又难看,但Eigen用大写字母书写重要消息,所以它很突出。例如:

Matrix3f m;
Vector4f v;
v = m*v;      // Compile-time error: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES
当然,在许多情况下,例如在检查动态大小时,不能在编译时执行检查。然后,Eigen使用运行时断言。这意味着,如果程序在“调试模式”下运行,则在执行非法操作时,程序将中止并显示错误消息,如果关闭断言,程序可能会崩溃

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

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

考虑到
M
N
是矩阵,
A
B
是向量,以下操作的结果是什么:

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中,它正在检查运算符的有效性,因此它会给您一个编译时错误,
+=
没有定义,并且您没有提供一个重载版本。它根本不知道如何执行预期的操作。无论
矩阵
向量
类的底层类型是什么,这都不重要。它涉及到这样一个事实:您试图执行的运算符没有在某个地方定义


编辑

这是一个描述矩阵和向量乘法的链接。直观地说,我们假设这会产生一个向量,然而,这是隐含的理解,但从矩阵的角度来看,这个向量可以是行或列,因此返回的向量可以是
1xM
Mx1
矩阵

这里有一个链接显示不同的解释,即使它们返回相同的结果:可以在文档的
3.2.3节中找到:

两种不同解释之间的运算数量不同,尽管它们提供相同的最终结果。如果不明确说明它是行产品还是列产品,这可能会导致某种类型的歧义。我不知道Eigen如何确定它将使用哪种方法,我假设它将选择运算量最少、计算量最少的方法


这不是你问题的主要问题。一天结束时,编译器仍会生成一条错误消息,表明未定义重载运算符。我不知道这是从你的代码里来的。因此,在尝试对其版本的
复杂类型执行操作时,这可能在其库本身中。如果无法运行和编译完整的源代码,我无法轻松确定到底是什么导致了这个编译器错误,我也不知道您使用的是什么编译器导致了错误

问题出在我身上。我重载了std::complex*real的*操作符,因为std的一些早期版本是不完整的。列出的第一个错误是进入Eigen,这使我误入歧途

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

CxRealAbs.h(111):未经转换,无法将“const-Eigen::Map,-1,1,0,-1,1>,1,Eigen::Stride>”转换为“double”

删除我的重载,它编译并运行正常。特征动态矩阵没有问题

谢谢你的回复


凯文

对不起,我不明白。从数学的角度来看,当你用一个向量乘以一个矩阵时,你得到一个向量,假设维数为compatible@Damien你说的没错,我会更新我的原始答案,提供一个链接让你更清楚。你可以发布一个完整但简单的程序,为了帮助我们了解问题所在,什么是
CxRealAbs.h
?请同时包含完整的错误消息。抱歉。CxRealAbs.h我的代码。重载std::complex*double的*运算符。