加载从数组矩阵到数组矩阵问题的数组

时间:2014-06-28 13:24:19

标签: c arrays matrix

我在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];

2 个答案:

答案 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];将修复您的编译器错误。