C++ - 无法访问反向索引

C++ - Can not access reverse indexing

如果标题有误,或者没有正确说明问题,还请见谅。

我正在尝试计算矩阵的 LU 分解。给出矩阵 M:

M = [1 2 3],
    [1 2 3], 
    [3 3 0]

现在我正在关注此处编写的一些代码:Link

它使用j i 来计算较低的分解。当我尝试这种方法时,我不断收到 "Runtime error time: 0 memory: 3276 signal:11"

我不明白的是,当我在 3x3 循环中输出 ij 时,我得到:

i, j = 
0 0 1 0 2 0 
0 1 1 1 2 1 
0 2 1 2 2 2 

然后当输出 j,i 的索引时,我得到:

j, i = 
0 0 0 1 0 2 
1 0 1 1 1 2 
2 0 2 1 2 2 

就顺序而言这似乎是正确的 [0][0][0][2].........[2][2] 那么为什么我不能在我的向量中访问它?

目前我写的代码是:

void lu_decomposition(const std::vector<std::vector<double> > &vals)
{
    std::vector<std::vector<double> > lower(3); 

    for(unsigned i=0; (i < 3); i++)
    {
        lower[i].resize(3);
        for(unsigned j=0; (j < 3); j++)
        {
            if (j < i)
            {
                lower[j][i] = 0; // This is ok
            }else{
                lower[j][i] = vals[j][i]; // This is the runtime error
            }

        }
        std::cout << std::endl;
    }
}

代码在 ideone

上也可见

让我们专注于这些行:

lower[i].resize(3);

//...

lower[j][i] = vals[j][i];

现在问题清楚了吗?您正在调整 lower[i] 的大小,但随后您正在访问 lower[j],甚至 j > i 的大小尚未调整。如果您需要以这种方式访问​​矩阵,则必须事先对其进行预分配。这意味着放弃 resize 调用,而是像这样初始化变量:

std::vector<std::vector<double> > lower(3, std::vector<double>(3));