从较小的 matrices/vectors 构建矩阵
Build matrix from smaller matrices/vectors
我的最终矩阵 A 的大小应该是 m x m,其中我有两个向量 v、k,大小为(m-1),应该分别是A中的第一列和第一行,不包括(0, 0)处为1的元素。其余元素A 对应于一些大小为 (m-1) x (m-1) 的矩阵 M。
3 x 3 矩阵示例
对于以下组件
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++ 的新手,所以我想知道这是否是最有效和最优雅的做法,如果涉及到更大的矩阵,我是否会 运行 遇到麻烦?
假设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
并由某些 block-expression 访问 M
、v
和 k
。
我的最终矩阵 A 的大小应该是 m x m,其中我有两个向量 v、k,大小为(m-1),应该分别是A中的第一列和第一行,不包括(0, 0)处为1的元素。其余元素A 对应于一些大小为 (m-1) x (m-1) 的矩阵 M。
3 x 3 矩阵示例
对于以下组件
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++ 的新手,所以我想知道这是否是最有效和最优雅的做法,如果涉及到更大的矩阵,我是否会 运行 遇到麻烦?
假设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
并由某些 block-expression 访问 M
、v
和 k
。