C++ 无法从';常量特征::通用产品<;左侧、右侧、产品类型>';至';双倍';
每次我计算这条线的时候都会遇到这个错误C++ 无法从';常量特征::通用产品<;左侧、右侧、产品类型>';至';双倍';,c++,eigen3,C++,Eigen3,每次我计算这条线的时候都会遇到这个错误 double k = b.transpose()*Z.inverse()*b; 其中Eigen::MatrixXd Z(3,3),b(3,1)。我试过选角,但运气不好。有什么建议吗?默认情况下,结果是一个特征表达式(将其视为一个矩阵,技术上是一个名为Eigen::GeneralProduct)的模板类型),因此,即使矩阵是1 x 1,它也不能隐式转换为double。您需要做的是访问它的(0)元素(或者(0,0),它没有任何区别),请参见下文 Eigen:
double k = b.transpose()*Z.inverse()*b;
其中
Eigen::MatrixXd Z(3,3),b(3,1)代码>。我试过选角,但运气不好。有什么建议吗?默认情况下,结果是一个特征表达式(将其视为一个矩阵,技术上是一个名为Eigen::GeneralProduct
)的模板类型),因此,即使矩阵是1 x 1
,它也不能隐式转换为double
。您需要做的是访问它的(0)
元素(或者(0,0)
,它没有任何区别),请参见下文
Eigen::MatrixXd Z(3,3), b(3,1);
double k = (b.transpose()*Z.inverse()*b)(0);
PS:@ggael提到,您应该使用特征::VectorXd
作为b
的类型,在这种情况下,结果可以隐式转换为双精度
这对我来说很有效,因此,请确保将b声明为VectorXd
,以便Eigen可以在编译时知道结果是1x1
矩阵,从而可以安全地将其转换为标量值。以下是一个独立的示例:
#include <Eigen/Dense>
using namespace Eigen;
int main() {
int n = 10;
VectorXd b(n);
MatrixXd Z(n,n);
double k = b.transpose() * Z.inverse() * b;
}
#包括
使用名称空间特征;
int main(){
int n=10;
向量xd b(n);
矩阵xDz(n,n);
双k=b.转置()*Z.逆()*b;
}
为什么投票被否决?这是一个表述完美的问题,简洁明了。OP展示了代码,提到了他尝试了什么,并要求提供一个完全符合SO的解决方案。如果你对Eigen
的经验较少,那么根本不清楚为什么1xn
矩阵和n1x1
矩阵之间的乘积不是标量(正如你在高中学到的那样),编译器会抛出一个模板类型的错误,这不是非常明显的。你也可以把它写成double k=(b.transpose()*Z.inverse()*b).value()
,这可能更可读(成员函数将1乘1的矩阵转换为标量)。@vsoftco:当且仅当用户使用通用矩阵存储向量时,您的答案才是正确的,这是使用Eigen的一种非常糟糕的做法。否则,这样的内积将隐式转换为double
@ggael感谢您的评论,您是说如果b
声明为VectorXd
,那么代码将隐式转换吗?好的,我自己刚刚发现这是真的,并编辑了我的答案,包括你的评论。