【问题标题】:C++ - Can not access reverse indexingC++ - 无法访问反向索引
【发布时间】:2015-04-14 07:13:24
【问题描述】:

如果标题有误,或者没有正确解释问题,请见谅。

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

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

现在我正在关注这里编写的一些代码:Link

它使用j i 来计算下层分解。当我尝试这种方法时,我不断收到“运行时错误时间:0 内存:3276 信号: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上也可见

【问题讨论】:

  • 使用vector::at()而不是vector::operator[](),你会得到一个运行时异常,告诉你哪里出错了,而不是在某个时候崩溃。或者启用编译器的标准库调试模式。

标签: c++ matrix vector memory-leaks


【解决方案1】:

让我们专注于以下几行:

lower[i].resize(3);

//...

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2018-10-17
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多