MatrixXd 和 VectorXd 之间的特征 C++ 矩阵乘法

Posted

技术标签:

【中文标题】MatrixXd 和 VectorXd 之间的特征 C++ 矩阵乘法【英文标题】:Eigen C++ matrix multiplication between MatrixXd and VectorXd 【发布时间】:2014-07-14 22:34:50 【问题描述】:

下面是我的代码,如您所见,我正在尝试将方阵 MatrixXd 与 vectorXd 相乘。

当我尝试这个时,我收到以下错误: “二进制表达式的无效操作数('const typename ProductReturnType > >, Matrix >::Type'(又名'const GeneralProduct

我不知道出了什么问题。如果这是一个不好的问题,我很抱歉,但请帮忙!

void calcMinPortfolio(int num_ofStocks, Eigen::MatrixXd& covMatrix, Eigen::VectorXd& weights)

Eigen::MatrixXd identityMat;
identityMat.resize(num_ofStocks, num_ofStocks);
identityMat.Identity();
weights = (covMatrix.inverse() * identityMat) / (identityMat.transpose() * covMatrix.inverse() * identityMat);


【问题讨论】:

【参考方案1】:

有2个问题:

1 - 构造恒等式的方式,不能在动态矩阵上使用.Identity()(仅在编译大小指定的大小上)。只需使用单线

Eigen::MatrixXd identityMat = Eigen::MatrixXd::Identity(num_ofStocks, num_ofStocks);

2 - 分母是一般矩阵乘积(一种类型),因此不能除以矩阵。将一个矩阵除以另一个矩阵是什么意思?如果这是您想要的,请使用 .inverse() 作为分母。接下来,乘以恒等式没有任何意义,除非covMatrix 是一个标量,而事实并非如此。

PS:即使分母是一个大小为1 x 1 的矩阵,它仍然是一个矩阵类型,而不是一个标量,所以你不能用它来划分一个矩阵。如果要除以矩阵表示的标量,则使用your_expresion(0)1 x 1 矩阵中提取标量。

【讨论】:

是的..我是个白痴。 identityMat 应该是 1 的向量......但这绝对可以帮助我解决未来的问题。非常感谢!

以上是关于MatrixXd 和 VectorXd 之间的特征 C++ 矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种直接、快速的方式将 list<VectorXd>“映射”到 MatrixXd?

复制列 VectorXd 以在 Eigen、C++ 中构造 MatrixXd

如何调整 Eigen::MatrixXd 的 std::vector 的大小

在 C++ 中为多维特征矩阵赋值?

如何根据索引的`vector<int>`使用来自另一个`Eigen::VectorXd`向量的值初始化`Eigen::VectorXd`

如何为不断增长的 Eigen::MatrixXd 预分配内存