首页 > 解决方案 > 从较小的矩阵/向量构建矩阵

问题描述

我的最终矩阵A的大小应为 mxm,其中我有两个大小为 (m-1) 的向量vk应该分别是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++ 相当陌生,我想知道这是否是最有效和最优雅的做法,以及在涉及更大的矩阵时是否会遇到麻烦?

标签: c++eigen

解决方案


假设vkn 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和访问Mvk通过一些块表达式。


推荐阅读