C++ - 提取核心子矩阵,将其反转并在大逆中重用
C++ - Extracting core submatrix, inverting it and reusing it in the big inverse
我有一个固定size = 900*900
matrix
。我通过做来填充它的元素
for (int i=0; i<size; ++i)
{
for (int j=i; j<size; ++j)
{
matrix[i][j]=matrix[j][i]= something(i,j);
其中something(i,j)
是我之前定义的函数。这样,最终matrix
看起来像这样
0000000000
0000000000
00------00
00------00
00------00
00------00
0000000000
0000000000
而亚麻布虚线表示不同于 0 的值。我给出的图片当然只是为了给出一个解释:大小是 900 X 900,我的问题是我需要反转这个矩阵。不幸的是,SVD 表现不佳。如您所见,该矩阵是对称的,并且具有这种特殊的"块"结构。我的想法是隔离矩阵的"核心"(与 0 不同的值,这应该给我一个更小的子矩阵,反转这个子矩阵并在更大的逆矩阵中重新替换,
0000000000
0000000000
00iiiiii00
00iiiiii00
00iiiiii00
00iiiiii00
0000000000
0000000000
其中i
是较小子矩阵的逆矩阵的等数。我如何有效地声明和填充这个子矩阵,从我发布的代码开始,它填充了大矩阵,c++
?
为了有效地做到这一点,就像在不复制内部矩阵的情况下一样,你需要支持跨步矩阵。 例如,Eigen通过他们的Eigen::Map
抽象提供了这一点。内部矩阵具有明显的原点和范围,但步幅与包含矩阵相同。
编辑:这被标记为C++,但不清楚您是否正在使用某种线性代数库。如果实现自己的操作,您可以通过指针算术或创造性索引自己完成跨步。如果将数据传递到库,它必须具有跨步机制,否则将无法工作。Numpy 确实支持与跨步外部数据的接口。
相关文章:
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何从 std::atomic 中提取指针 T<T>?
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 为什么istream不支持右值提取
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 在c++中初始化矩阵时出现分段错误(核心转储)
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- MPI突然停止了对多个核心的操作
- 如何设置一个范围来提取我想要获得的信息
- 在多个核心中处理一个HTTP请求
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 视觉工作室项目.提取源文件夹名称
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 从字符串中提取整数并形成一个数组
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 运算符继承和 cpp 核心准则 c.128 的问题
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 使用核心音频从默认的线路输出声音设备中提取浮动