C++ - 提取核心子矩阵,将其反转并在大逆中重用

C++ - Extracting core submatrix, inverting it and reusing it in the big inverse

本文关键字:核心 提取 C++      更新时间:2023-10-16

我有一个固定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 确实支持与跨步外部数据的接口。