使用矩阵

时间:2017-04-28 01:39:02

标签: c++ matrix vector segmentation-fault

我试图模拟一组神经元的平均行为。这意味着我需要用数十亿元素的矩阵进行计算(steps ~10 6 neurons ~10 <子> 4 )。

为了避免吃掉我的整个RAM(并且试图死亡),我决定在用它完成计算后立即从矩阵中删除行。我没有太多使用C ++的经验,但我的理解是v.erase( v.begin()-i+1);应该允许我这样做。

// Membrane potential matrix using st::vector
vector<vector<double>> v;
v.resize(steps + 1, vector<double>(neurons));
// Initialise v
for (size_t n = 0; n < neurons; n++) {
    v[0][n] = v0;
}

double v_avg[steps + 1] = {v0};

// Loop
for (size_t i = 1; i < steps + 1; i++) {
    for (size_t n = 0; n < neurons; n++) {
        if(v[i-1][n] >= vp) {
            v[i][n] = -vp;
        }
        else {
            v[i][n] = v[i-1][n] + h * ( pow(v[i-1][n], 2) + I[i] + eta[n] );
        }
        v_avg[i] += v[i][n]; // Sum of membrane potentials
    }
    cout << "step " << i << "/" << steps << " done\n";
    v.erase( v.begin()-i+1); // Erase row v[i-1]
    v_avg[i] = v_avg[i]/neurons; // Mean membrane potential
}
v.erase( v.begin()+steps+1 ); // Erase last row

我不确定为什么我在steps / 2步骤之后出现分段错误(我正在使用小steps值进行测试):

...    
step 10/20 done
[1]    1791 segmentation fault (core dumped)  ./qif_solve_vect

更新

感谢@1201ProgramAlarm我知道我的问题是什么。我的问题是:

  1. 我如何以一种从一开始就没有分配的方式处理矩阵。
  2. 如何在保留索引的同时解除分配/释放行(与v.erase( v.begin())不同)。这是必不可少的,因为我稍后会在每个神经元产生尖峰(v[i][n] = -vp;)时实施不同的难治时间。

1 个答案:

答案 0 :(得分:1)

erase语句中,您将从v.begin()中减去,这将导致无效的迭代器,因为它将指向向量的开始之前。你可能意味着v.erase( v.begin() + i - 1);

然而,像这样擦除并不能节省任何空间,因为你已经分配了完整的矩阵。擦除会将所有剩余元素向下移动一个元素,并且下一个循环的索引将是错误的(因为您希望始终使用v[0])。