在 C++ 中处理大矩阵的困难
difficulties with handling big matrices in c++
我尝试在 C++ 中使用 - 甚至不是太庞大的矩阵,但似乎存在内存问题,我可能需要一些帮助。
以下代码编译时没有警告 g++ -Wall -Wextra -o matrix main.cpp
但是当我想 运行 它时,我收到以下消息:zsh: segmentation fault ./matrix
我的编译器版本是:Apple clang version 12.0.0 (clang-1200.0.32.29)
#define HEIGHT 0x1000
#define WIDTH 0x1000
#include <iostream>
#include <vector>
#include <array>
int main () {
int hexVal = 0x0;
std::array<std::array<int, HEIGHT>, WIDTH > matrix;
//std::vector< std::vector<int> > matrix (HEIGHT*WIDTH);
for (int i = 0; i < HEIGHT; i++){
for(int j = 0; j < WIDTH; j++) {
matrix[i][j] = hexVal;
hexVal++;
}
}
std::cout << "your matrix is living here: " << &matrix << std::endl;
return 0;
}
我已经用 std::vector
尝试过同样的方法,但是无论我做什么,当 运行ning 时我总是会得到这个错误:zsh: segmentation fault ./matrix
至少在使用 std::array
时,它有助于改变矩阵的大小,但不幸的是,这不是一个选项。
#define HEIGHT 0x100
#define WIDTH 0x100
工作正常。
有趣的是,尽管以下方法也有效,
#define HEIGHT 0x100
#define WIDTH 0x1000
但下面没有。
#define HEIGHT 0x1000
#define WIDTH 0x100
我读了一些关于分段错误的文章,得出的结论是它可能是硬件缺陷,但此时我仍然不想相信。我希望,一些 Whosebug 魔法可以帮助我。
提前致谢。
因为 std::array
不适合非常大的矩阵,如果你把它放在堆栈上,就像你做的那样。堆栈有限,有时大小可能低于 1MB。
尝试使用 std::vector
或在堆上分配 std::array
。堆没有限制,它几乎可以增长到整个 RAM 的大小。
下一个例子是使用 std::vector
,在我的机器上它没有崩溃。
另请注意我如何在代码中定义 std::vector 变量,它与您的定义不同。
#define HEIGHT 0x1000
#define WIDTH 0x1000
#include <iostream>
#include <vector>
int main () {
int hexVal = 0x0;
std::vector<std::vector<int>> matrix(HEIGHT, std::vector<int>(WIDTH));
for (int i = 0; i < HEIGHT; i++){
for(int j = 0; j < WIDTH; j++) {
matrix[i][j] = hexVal;
hexVal++;
}
}
std::cout << "your matrix is living here: " << &matrix << std::endl;
return 0;
}
输出:
your matrix is living here: 000000D275CFFA28
正如@WhozCraig 所建议的,也可以使用 std::array 作为内部数组,即通过以下方式创建矩阵:
std::vector matrix(HEIGHT, std::array<int, WIDTH>{});
我尝试在 C++ 中使用 - 甚至不是太庞大的矩阵,但似乎存在内存问题,我可能需要一些帮助。
以下代码编译时没有警告 g++ -Wall -Wextra -o matrix main.cpp
但是当我想 运行 它时,我收到以下消息:zsh: segmentation fault ./matrix
我的编译器版本是:Apple clang version 12.0.0 (clang-1200.0.32.29)
#define HEIGHT 0x1000
#define WIDTH 0x1000
#include <iostream>
#include <vector>
#include <array>
int main () {
int hexVal = 0x0;
std::array<std::array<int, HEIGHT>, WIDTH > matrix;
//std::vector< std::vector<int> > matrix (HEIGHT*WIDTH);
for (int i = 0; i < HEIGHT; i++){
for(int j = 0; j < WIDTH; j++) {
matrix[i][j] = hexVal;
hexVal++;
}
}
std::cout << "your matrix is living here: " << &matrix << std::endl;
return 0;
}
我已经用 std::vector
尝试过同样的方法,但是无论我做什么,当 运行ning 时我总是会得到这个错误:zsh: segmentation fault ./matrix
至少在使用 std::array
时,它有助于改变矩阵的大小,但不幸的是,这不是一个选项。
#define HEIGHT 0x100
#define WIDTH 0x100
工作正常。
有趣的是,尽管以下方法也有效,
#define HEIGHT 0x100
#define WIDTH 0x1000
但下面没有。
#define HEIGHT 0x1000
#define WIDTH 0x100
我读了一些关于分段错误的文章,得出的结论是它可能是硬件缺陷,但此时我仍然不想相信。我希望,一些 Whosebug 魔法可以帮助我。 提前致谢。
因为 std::array
不适合非常大的矩阵,如果你把它放在堆栈上,就像你做的那样。堆栈有限,有时大小可能低于 1MB。
尝试使用 std::vector
或在堆上分配 std::array
。堆没有限制,它几乎可以增长到整个 RAM 的大小。
下一个例子是使用 std::vector
,在我的机器上它没有崩溃。
另请注意我如何在代码中定义 std::vector 变量,它与您的定义不同。
#define HEIGHT 0x1000
#define WIDTH 0x1000
#include <iostream>
#include <vector>
int main () {
int hexVal = 0x0;
std::vector<std::vector<int>> matrix(HEIGHT, std::vector<int>(WIDTH));
for (int i = 0; i < HEIGHT; i++){
for(int j = 0; j < WIDTH; j++) {
matrix[i][j] = hexVal;
hexVal++;
}
}
std::cout << "your matrix is living here: " << &matrix << std::endl;
return 0;
}
输出:
your matrix is living here: 000000D275CFFA28
正如@WhozCraig 所建议的,也可以使用 std::array 作为内部数组,即通过以下方式创建矩阵:
std::vector matrix(HEIGHT, std::array<int, WIDTH>{});