我很擅长使用c ++进行编码,所以如果这个问题有一个非常明显的简单答案我会道歉。我正在尝试创建一个从-1到1的随机数矩阵。这是我正在使用的两个函数:
#include <iostream>
#include "matrix_fill_random.cpp"
using namespace std;
int main(int argc, int argv[]){
int n1, n2, n3;
if (argc != 4) {
cerr << "This program requires 3 argument!" <<endl;
return 1;
}
else{
n1 = argv[1];
n2 = argv[2];
n3 = argv[3];
double** a;
matrix_fill_random(n1, n2, a);
return 0;
}
}
和
#include <iostream>
using namespace std;
int matrix_fill_random(int n1, int n2, double** a){
for (int i=0; i<n1; i++){
for (int j=0; j<n2; j++){
double num = rand() % 2 - 1;
a[i][j]=num;
}
}
return 0;
}
最终我试图创建两个矩阵然后将它们相乘,因此n1,n2和n3代表两个矩阵的行和列,但现在这并不是太重要。我认为错误可能在于如何声明我的变量或将它们传递给其他函数,但我不完全确定。
我觉得如果我能理解创建其中一个矩阵的原则,那么这将转化为我需要使用的其他函数。
答案 0 :(得分:1)
double** a;
您尚未为指针分配内存,因此每次使用operator []
取消引用时,您都会获得未定义的行为。
在传递函数之前,您应该分配a
一次......
double** a = new double*[n1];
再一次在函数的for循环中:
for (int i = 0; i < n1; i++)
{
a[i] = new double[n2];
for (int j = 0; j < n2; j++)
{
double num = rand() % 2 - 1;
a[i][j] = num;
}
}
但是一旦你完成使用它,不要忘记delete[]
指针。你应该delete
在for循环中分配的其他指针。
当然,使用std::vector
可以避免这一切。这是您的程序配有标准库:
std::vector<std::vector<double>> a(n1, std::vector<double>(n2));
int matrix_fill_random(std::vector<std::vector<double>> a)
{
for (int i = 0; i < a.size(); ++i)
{
for (int j = 0; j < a[i].size(); ++j)
{
double num = rand() % 2 - 1;
a[i][j] = num;
}
}
return 0;
}
答案 1 :(得分:1)
为a
分配内存。你没有为a分配内存。将语句double** a;
更改为
double** a = new double[n1];
并按如下方式更改循环
for (int i = 0; i < n1; i++)
{
//Every row will be of size = number of columns.
a[i] = new double[n2];
for (int j = 0; j < n2; j++)
{
double num = rand() % 2 - 1;
a[i][j] = num;
}
}
答案 2 :(得分:0)
double** a;
matrix_fill_random(n1, n2, a);
将未初始化的指针a
传递给函数,该函数尝试初始化二维数组的元素:
a[i][j]=num;
调用 未定义的行为 。最简单的解决方案是分配一个足够大的内存块来保存矩阵:
double* a = new double[rows * cols];
matrix_fill_random(n1, n2, a);
delete[] a;
a = NULL;
...
// accessing element a[i][j] in the function's body:
a[i*cols + j] = num;
但最合理的解决方案是使用std::vector
而不是C风格的数组。
答案 3 :(得分:0)
在将内存传递给a
之前,您需要将内存分配给matrix_fill_random()
。
double** a = new double[n1];
由于您使用的是C ++,因此应考虑使用vector或其他template container。