Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从';常量特征::通用产品<;左侧、右侧、产品类型>';至';双倍';_C++_Eigen3 - Fatal编程技术网

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
,那么代码将隐式转换吗?好的,我自己刚刚发现这是真的,并编辑了我的答案,包括你的评论。