c++ - 从较小的矩阵/向量构建矩阵
问题描述
我的最终矩阵A的大小应为 mxm,其中我有两个大小为 (m-1) 的向量v和k应该分别是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
和访问M
,v
并k
通过一些块表达式。
推荐阅读
- javascript - fotorama 画廊在 Swiper 滑块中不起作用
- html - h1 标记中的文本溢出 div 容器
- linux - cx_Oracle 5.3 是否与 Oracle 客户端 19.10 兼容?
- javascript - 如何在 Angular 9 中使用 npm 包的 Highchart 地图集合的 CDN?
- javascript - 错误:使用了无效函数返回值
- reactjs - 无法在代码中找到问题以根据 React 中的用户输入动态分配组件名称
- angular - Syncfusion TreeGrid + Angular 11“错误:必须从注入上下文中调用注入()”
- php - Laravel 如何在两个独立的数据库中创建迁移关系?
- python - 在python中提取Unicode文本
- module - 如何在 Ejabberd 的自定义模块中加载模块?