我的最终矩阵 A 的大小应为mxm,其中有两个向量 v , k ,其大小为(m-1 ),并且应该分别是 A 中的第一列和行,但不包括(0,0)处为1的元素。 A 的其余元素对应于某些矩阵< (m-1)x(m-1)的strong> M 。
对于以下组件
v = 2 2
k = 3 3
M = 4 4
4 4
我想得到
A = 1 2 2
3 4 4
3 4 4
注意:实际上,v,k和M的元素可以是任意的。
对于3 x 3的示例矩阵,我的代码如下所示。
#include <iostream>
#include <Eigen/Dense>
int main(){
Eigen::MatrixXd m;
m.resize(3,3);
Eigen::VectorXd v;
v.resize(3);
v[0] = 1 ;
v[1] = 2;
v[2] = 2;
Eigen::VectorXd k;
k.resize(3);
k[0] = 1;
k[1] = 3;
k[2] = 3;
Eigen::Matrix2d a = Eigen::Matrix2d::Constant(4);
m.col(0) = k;
m.row(0) = v;
m.block<2,2>(1,1) = a;
std::cout << m << std::endl;
return 0;
}
输出如下所示:
1 2 2
3 4 4
3 4 4
在实际程序中,最终矩阵的阶数为10 ^ 4-10 ^ 6。因为我对C ++相当陌生,所以我想知道这样做是否是最高效,最优雅的方法,以及在涉及更大的矩阵时是否会遇到麻烦?
答案 0 :(得分:1)
假设v
和k
是n x 1
个向量,而M
是n x n
矩阵,则可以这样写:
Eigen::MatrixXd A(M.rows()+1, M.cols()+1);
A << 1, v.transpose(),
k, M;
这与使用row
,col
和block
的代码几乎一样,但可能更具可读性。除非发生在关键循环内,否则我在这里不必担心性能。
如果这是在关键循环内发生的,请考虑仅存储A
并通过某些块表达式访问M
,v
和k
。