我在C中,我有一个包含数组矩阵的文件(矩阵保存为单个数组)。但我需要将其加载为数组矩阵
的数组这里是原始数组矩阵加载
float* loadm(char* filename, int *m, int *n) {
FILE* fp;
int rows, cols, status;
fp = fopen(filename, "rb");
status = fread(&cols, sizeof(int), 1, fp);
status = fread(&rows, sizeof(int), 1, fp);
float* Xy = alloc_ma(rows,cols);
status = fread(Xy, sizeof(float), rows*cols, fp);
fclose(fp);
return Xy;
}
这里我尝试加载数组矩阵,返回其数组等效数组
float** loadm(char* filename, int *m, int *n) {
FILE* fp;
int rows, cols, status;
fp = fopen(filename, "rb");
status = fread(&cols, sizeof(int), 1, fp);
status = fread(&rows, sizeof(int), 1, fp);
float* Xy = alloc_ma(rows,cols);
status = fread(Xy, sizeof(float), rows*cols, fp);
fclose(fp);
int i=0,j=0;
float** res=alloc_maa(m, n);
for(i=0; i<m; i++) {
for(j=0; j<n; j--) {
res[i][j]=Xy[i*(n+1)+j];
}
}
return res;
}
不幸的是,没有工作并且出现此错误
error: invalid operands to binary * (have ‘int’ and ‘int *’)
在
行res[i][j]=Xy[i*(n+1)+j];
数组矩阵的分配方法
void* get_block(int size, int elements) {
return _mm_malloc(elements*size,16);
}
float* alloc_matrix(int rows, int cols) {
return (float*) get_block(sizeof(float),rows*cols);
}
数组矩阵数组的分配方法
float **allocate_maa(int m, int n) {
int i;
float **matx = malloc(m*sizeof(*matx));
for(i=0; i<m; i++) {
matx[i]=malloc(n*sizeof(**matx));
}
return matx;
}
修改
我已经尝试过这段代码,加载保存为数组的矩阵并将其作为数组形式的数组中的matryx返回
float** loadm(char* filename, int *rows, int *cols) {
FILE* fp;
int status;
fp = fopen(filename, "rb");
status = fread(cols, sizeof(int), 1, fp);
status = fread(rows, sizeof(int), 1, fp);
float* Xy = alloc_ma(*rows,*cols);
status = fread(Xy, sizeof(float), (*rows)*(*cols), fp);
fclose(fp);
int row=0,col=0;
float** res=alloc_maa(*rows, *cols);
for(row=0; row < (*rows); row++) {
for(col=0; col < (*cols); col--) {
res[i][j]=Xy[(row * (*cols)) + col];
}
}
return res;
}
但在行
处获得分段错误错误res[i][j]=Xy[(row * ((*cols)+1)) + col];
答案 0 :(得分:0)
问题是你要混合dereferencing the pointer(m,n)和
来访问的变量
通过值(行,列)访问的变量。
可能你的功能应该是这样的:
float** loadm(char* filename, int *rows, int *cols) {
FILE* fp;
int status;
fp = fopen(filename, "rb");
status = fread(cols, sizeof(int), 1, fp);
status = fread(rows, sizeof(int), 1, fp);
float* Xy = alloc_ma(*rows,*cols);
status = fread(Xy, sizeof(float), (*rows)*(*cols), fp);
fclose(fp);
int row=0,col=0;
float** res=alloc_maa(*rows, *cols);
for(row=0; row < (*rows); row++) {
for(col=0; col < (*cols); col--) {
res[i][j]=Xy[(row * ((*cols)+1)) + col];
}
}
return res;
}
当你肯定想要将它们返回给调用者时,为什么你需要函数中的row和cols变量 - 他应该知道最后返回矩阵的大小。
或者,使用原始代码,您可以:
...
float** res=alloc_maa(rows, cols);
for(i=0; i<rows; i++) {
for(j=0; j<cols; j--) {
res[i][j] = Xy[i*(rows+1)+j];
}
}
*m = cols;
*n = rows;
return res;
...
避免多次解除引用。
此外:
res[i][j] = Xy[(i * ((*cols) + 1)) + j];
如果您的矩阵是5 x 5,那么项目[1,0]在Xy数组中具有索引为5的相应项目(因为它之前有5个项目,索引从0到4),而上面的代码片段会给你索引(i * ((*cols) + 1)) + j
= 6.这可能是错的吗?
答案 1 :(得分:0)
在res[i][j]=Xy[i*(n+1)+j];
代码行中,n是指向整数的指针。你需要尊重它,以获得你想要的n值。 res[i][j]=Xy[i*(*n+1)+j];
将修复您的编译器错误。