从较小的 matrices/vectors 构建矩阵

Build matrix from smaller matrices/vectors

我的最终矩阵 A 的大小应该是 m x m,其中我有两个向量 vk,大小为(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++ 的新手,所以我想知道这是否是最有效和最优雅的做法,如果涉及到更大的矩阵,我是否会 运行 遇到麻烦?

假设vkn x 1向量,Mn x n矩阵,你可以这样写:

Eigen::MatrixXd A(M.rows()+1, M.cols()+1);
A << 1, v.transpose(),
     k, M;

这与您使用 rowcolblock 的代码几乎相同,但可能更具可读性。除非这发生在关键循环内,否则我不会太担心这里的性能。

如果这发生在关键循环内,请考虑仅存储 A 并由某些 block-expression 访问 Mvk