从较小的矩阵/向量构建矩阵

时间:2019-05-27 12:48:41

标签: c++ eigen

我的最终矩阵 A 的大小应为mxm,其中有两个向量 v k ,其大小为(m-1 ),并且应该分别是 A 中的第一列和行,但不包括(0,0)处为1的元素。 A 的其余元素对应于某些矩阵< (m-1)x(m-1)的strong> 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 ++相当陌生,所以我想知道这样做是否是最高效,最优雅的方法,以及在涉及更大的矩阵时是否会遇到麻烦?

1 个答案:

答案 0 :(得分:1)

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

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

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

如果这是在关键循环内发生的,请考虑仅存储A并通过某些块表达式访问Mvk