Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+;中动态分配2D数组的警告+; 我写了一个C++图像检测代码,其中有两个矩阵输入[60001 ] [785 ]。 重量[785][60001]。我需要将它们相乘(在mat_mult()内完成)并计算结果的sigmoid(在sigmoid()内完成)。结果的大小太大,这就是为什么我对这些数组使用动态分配。但是,我仍然收到溢出警告。当我运行代码时,我还得到:std::bad_array\u new_length错误,代码退出。我怎样才能解决这个问题?有没有更好的方法来声明和使用这些数组 #include <iostream> #include <fstream> #include <vector> //#include <gsl/gsl> #include <cmath> using namespace std; int col = 785; // amount of columns int lines = 60001; // amount of lines int x = 0; // a variable that will contain a value from the file vector <float> myValues; float weight[785][60001]; float input[60001][785]; std::vector<float> sigmoid(std::vector<float> matrix) { int i,j; matrix.reserve(60001ull * 60001ull); for(i=0;i<60001;i++) { for(j=0;j<60001;j++) { matrix[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)] = 1/(1+exp(-matrix[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)])); //matrix[(i*60001)+j] = 1/(1+exp(-matrix[])); } } return matrix; } std::vector<float> mat_mult(float a[60001][785],float b[785][60001]) { int i,j,k; std::vector<float> mult; mult.reserve(60001ull * 60001ull); //float(*mult) = new float[60001*60001]; for(i = 0; i < 60001; i++) { for(j = 0; j < 60001; j++) { for(k = 0; k < 60001; k++) { mult[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)] += a[i][k] * b[k][j]; } } } return mult; } int main() { int i,j,k,row,column,row_count=0; std::vector<float> mult; mult.reserve(60001ull * 60001ull); std::vector<float> sigmoid_matrix; sigmoid_matrix.reserve(60001ull * 60001ull); //Read the csv File: ifstream ifs ("fashion-mnist_train.csv"); char dummy; for ( i = 0; i < lines; ++i){ for ( i = 0; i < col; ++i){ ifs >> x; //cout<<"value being stored: "<<x<<endl; myValues.push_back(x); // So the dummy won't eat digits if (i < (col - 1)) ifs >> dummy; } } //Reading csv File completed. // Store input in 2-D format for better understanding. for(i=0;i<60001;i++) { for(j=0;j<785;j++) { input[i][j] = myValues[(i*785)+j]; } } //Multiply input and weight matrix: mult=mat_mult(input,weight); sigmoid_matrix=sigmoid(mult); for(i=0;i<20;i++) { for(j=0;j<20;j++) { cout<< sigmoid_matrix[(i*60001)+j]; } cout<<endl; } cout<<"finished execution\n"; return 0; } #包括 #包括 #包括 //#包括 #包括 使用名称空间std; int col=785;//列数 int lines=60001;//行数 int x=0;//将包含文件中的值的变量 向量值; 浮子重量[785][60001]; 浮点输入[60001][785]; std::向量sigmoid(std::向量矩阵) { int i,j; 储备矩阵(60001ull*60001ull); 对于(i=0;i x; //cout_C++ - Fatal编程技术网

在C+;中动态分配2D数组的警告+; 我写了一个C++图像检测代码,其中有两个矩阵输入[60001 ] [785 ]。 重量[785][60001]。我需要将它们相乘(在mat_mult()内完成)并计算结果的sigmoid(在sigmoid()内完成)。结果的大小太大,这就是为什么我对这些数组使用动态分配。但是,我仍然收到溢出警告。当我运行代码时,我还得到:std::bad_array\u new_length错误,代码退出。我怎样才能解决这个问题?有没有更好的方法来声明和使用这些数组 #include <iostream> #include <fstream> #include <vector> //#include <gsl/gsl> #include <cmath> using namespace std; int col = 785; // amount of columns int lines = 60001; // amount of lines int x = 0; // a variable that will contain a value from the file vector <float> myValues; float weight[785][60001]; float input[60001][785]; std::vector<float> sigmoid(std::vector<float> matrix) { int i,j; matrix.reserve(60001ull * 60001ull); for(i=0;i<60001;i++) { for(j=0;j<60001;j++) { matrix[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)] = 1/(1+exp(-matrix[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)])); //matrix[(i*60001)+j] = 1/(1+exp(-matrix[])); } } return matrix; } std::vector<float> mat_mult(float a[60001][785],float b[785][60001]) { int i,j,k; std::vector<float> mult; mult.reserve(60001ull * 60001ull); //float(*mult) = new float[60001*60001]; for(i = 0; i < 60001; i++) { for(j = 0; j < 60001; j++) { for(k = 0; k < 60001; k++) { mult[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)] += a[i][k] * b[k][j]; } } } return mult; } int main() { int i,j,k,row,column,row_count=0; std::vector<float> mult; mult.reserve(60001ull * 60001ull); std::vector<float> sigmoid_matrix; sigmoid_matrix.reserve(60001ull * 60001ull); //Read the csv File: ifstream ifs ("fashion-mnist_train.csv"); char dummy; for ( i = 0; i < lines; ++i){ for ( i = 0; i < col; ++i){ ifs >> x; //cout<<"value being stored: "<<x<<endl; myValues.push_back(x); // So the dummy won't eat digits if (i < (col - 1)) ifs >> dummy; } } //Reading csv File completed. // Store input in 2-D format for better understanding. for(i=0;i<60001;i++) { for(j=0;j<785;j++) { input[i][j] = myValues[(i*785)+j]; } } //Multiply input and weight matrix: mult=mat_mult(input,weight); sigmoid_matrix=sigmoid(mult); for(i=0;i<20;i++) { for(j=0;j<20;j++) { cout<< sigmoid_matrix[(i*60001)+j]; } cout<<endl; } cout<<"finished execution\n"; return 0; } #包括 #包括 #包括 //#包括 #包括 使用名称空间std; int col=785;//列数 int lines=60001;//行数 int x=0;//将包含文件中的值的变量 向量值; 浮子重量[785][60001]; 浮点输入[60001][785]; std::向量sigmoid(std::向量矩阵) { int i,j; 储备矩阵(60001ull*60001ull); 对于(i=0;i x; //cout

在C+;中动态分配2D数组的警告+; 我写了一个C++图像检测代码,其中有两个矩阵输入[60001 ] [785 ]。 重量[785][60001]。我需要将它们相乘(在mat_mult()内完成)并计算结果的sigmoid(在sigmoid()内完成)。结果的大小太大,这就是为什么我对这些数组使用动态分配。但是,我仍然收到溢出警告。当我运行代码时,我还得到:std::bad_array\u new_length错误,代码退出。我怎样才能解决这个问题?有没有更好的方法来声明和使用这些数组 #include <iostream> #include <fstream> #include <vector> //#include <gsl/gsl> #include <cmath> using namespace std; int col = 785; // amount of columns int lines = 60001; // amount of lines int x = 0; // a variable that will contain a value from the file vector <float> myValues; float weight[785][60001]; float input[60001][785]; std::vector<float> sigmoid(std::vector<float> matrix) { int i,j; matrix.reserve(60001ull * 60001ull); for(i=0;i<60001;i++) { for(j=0;j<60001;j++) { matrix[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)] = 1/(1+exp(-matrix[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)])); //matrix[(i*60001)+j] = 1/(1+exp(-matrix[])); } } return matrix; } std::vector<float> mat_mult(float a[60001][785],float b[785][60001]) { int i,j,k; std::vector<float> mult; mult.reserve(60001ull * 60001ull); //float(*mult) = new float[60001*60001]; for(i = 0; i < 60001; i++) { for(j = 0; j < 60001; j++) { for(k = 0; k < 60001; k++) { mult[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)] += a[i][k] * b[k][j]; } } } return mult; } int main() { int i,j,k,row,column,row_count=0; std::vector<float> mult; mult.reserve(60001ull * 60001ull); std::vector<float> sigmoid_matrix; sigmoid_matrix.reserve(60001ull * 60001ull); //Read the csv File: ifstream ifs ("fashion-mnist_train.csv"); char dummy; for ( i = 0; i < lines; ++i){ for ( i = 0; i < col; ++i){ ifs >> x; //cout<<"value being stored: "<<x<<endl; myValues.push_back(x); // So the dummy won't eat digits if (i < (col - 1)) ifs >> dummy; } } //Reading csv File completed. // Store input in 2-D format for better understanding. for(i=0;i<60001;i++) { for(j=0;j<785;j++) { input[i][j] = myValues[(i*785)+j]; } } //Multiply input and weight matrix: mult=mat_mult(input,weight); sigmoid_matrix=sigmoid(mult); for(i=0;i<20;i++) { for(j=0;j<20;j++) { cout<< sigmoid_matrix[(i*60001)+j]; } cout<<endl; } cout<<"finished execution\n"; return 0; } #包括 #包括 #包括 //#包括 #包括 使用名称空间std; int col=785;//列数 int lines=60001;//行数 int x=0;//将包含文件中的值的变量 向量值; 浮子重量[785][60001]; 浮点输入[60001][785]; std::向量sigmoid(std::向量矩阵) { int i,j; 储备矩阵(60001ull*60001ull); 对于(i=0;i x; //cout,c++,C++,变量mult的长度为3660121001。int类型仅支持从-2147483648到2147483647。如果需要负数,则需要使用支持从0到4294967295的无符号int或从-(2^63)到(2^63)-1的长整型int。因此,它是否是动态的并不重要 在本页中,您可以找到所有尺寸信息,以供参考 也是,这是C++的官方页面,有深入的细节,请参考下面的评论。 要解决您的问题,您可以使用std::vector(您尝试创建的数组不能大于7FFFFFFF=2147483647,并且您正在尝试创建600

变量mult的长度为3660121001。int类型仅支持从-2147483648到2147483647。如果需要负数,则需要使用支持从0到4294967295的无符号int或从-(2^63)到(2^63)-1的长整型int。因此,它是否是动态的并不重要

在本页中,您可以找到所有尺寸信息,以供参考

也是,这是C++的官方页面,有深入的细节,请参考下面的评论。


要解决您的问题,您可以使用
std::vector
(您尝试创建的数组不能大于
7FFFFFFF=2147483647
,并且您正在尝试创建
60001*60001=3600120001
项,如其他答案中所述

无论您在何处定义新数组

int(*mult) = new int[60001 * 60001];
你可以用

std::vector<int> mult;
mult.reserve(60001ull * 60001ull);
std::vector mult;
多元储备(60001ull*60001ull);
并访问类似于数组的向量

mult[(static_cast<unsigned long long>(i) * 60001ull) + static_cast<unsigned long long>(j)] += a[i][k] * b[k][j];
mult[(静态_-cast(i)*60001ull)+静态_-cast(j)]+=a[i][k]*b[k][j];
当为尺寸指定大数字时,可以使用ULL后缀表示应使用8字节的
unsigned long long
整数值,因此
60001ull


我还没有测试完整的代码,但这允许您的代码进行编译,您可能还需要解决其他问题。

float*sigmoid(float(*matrix)=new float[60001*60001])
意味着,默认情况下,调用此函数会分配大约14GB的内存(假设为4字节的浮点)。很少有系统会容忍不得不偶然分配多个如此大小的块,更不用说在代码中,每次调用时内存都会泄漏。根据经验,需要重新设计调用这种大小矩阵的代码,以使用更少的内存。我刚刚意识到我需要所有数组都是浮动的,所以我必须我的代码是相应的。但是我得到了同样的警告和错误。我认为C++中没有浮点浮标。有没有解决办法?没有任何浮点的浮点加在C++中,我也不知道有第三方库提供它们。剃一点奇数也没什么大帮助。C++标准只保证了< COD】。e> int将至少为16字节,且不大于
。如今32位很常见,但16位和64位并非闻所未闻。链接的图表是假的。这里有一个更好的例子:问题通常不是数组的最大大小。如果
向量
可以做到这一点,则新的
ed数组应该可以做到。整数math可能溢出并将2s恭维值翻转到-5000左右。您的解决方案有效(并且可能更好),但不是因为您在开头一段中描述的原因。我尝试了您的修复,但在运行代码时仍然出现错误。我得到的错误是:“在抛出'std::length_error'实例后终止调用what():vector::reserve“我认为这与我们的大小有关。你能看一下上面的代码吗?我已经添加了我修改过的代码。谢谢!你上面更新的代码似乎在我的情况下编译。正如我所提到的,我试图修复你看到的溢出编译器问题。你收到的错误可能是抛出了异常,而应用程序崩溃是因为它没有被处理。在我看来,你可以逐行调试,看看哪里出了问题。当我使用代码
int(*mult)=new int[60001ull*60001ull];
编译器给出
错误C2148:数组的总大小不能超过0x7fffffff字节
,因此我建议使用vector。