gpt4 book ai didi

c++ - 在使用矩阵进行计算时删除 C++ 二维 vector 行

转载 作者:行者123 更新时间:2023-11-30 05:13:55 32 4
gpt4 key购买 nike

我正在尝试模拟一组神经元的平均行为。这意味着我需要对包含数十亿个元素的矩阵进行计算(steps~106, neurons~104)。

为了避免耗尽我的整个 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;)。

最佳答案

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

但是,像这样删除不会为您节省任何空间,因为您已经分配了完整的矩阵。删除会将所有剩余元素向下移动一个元素,并且您对下一个循环的索引将是错误的(因为您想要一直使用 v[0])。

关于c++ - 在使用矩阵进行计算时删除 C++ 二维 vector 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43670559/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com