2

我被困在这里。我有一个大小为 NxN 的矩阵存储在一个双数组中。然后我想删除给定的列,比如说第一列。所以我创建了一个大小为 NxN-1 的新双精度数组,并将值从第一个矩阵复制到第二个矩阵,当然第一列除外。但后来我想将第一个数组设置为第二个数组。我在这里空白。

double matrix[N][N]
//fill up the matrix code here...


// remove first column of array
double newMatrix[N][N-1];
for(i = 0; i < N; i++){
    for(j = 1; j < N; j++){
        newMatrix[i][j-1] = matrix[i][j];
    }
}
matrix = newMatrix; // how do I set this correctly?  Do I need to realloc the first array?
4

3 回答 3

2

您不能在 C 中分配数组,我假设您的编译器会告诉您。要进行这种动态内存管理,您需要使用指针而不是数组。我建议你阅读如何malloc()free()工作,以便你可以做你想做的事。

编辑:

如果您只删除列(或行) ,则会想到另一个解决方案:跟踪数组中使用的行数和列数。然后,您可以删除原始数组中的一行或一列,而无需先创建副本。只需将数据通过删除列(或行)向左(或向上)移动,然后减少您的大小计数器。(我希望这是有道理的。如果不让我知道,我会详细说明。)

于 2013-03-08T01:16:39.120 回答
1

array + stride_x[x] + stride_y[y]可以选择从;访问元素,而不是从 array[i][j] 访问元素。其中 array 最初是作为double matrix[N*N];or引入的double *matrix = malloc(sizeof(double)*N*N);

stride_y[x] 最初将包含所有行的列偏移量:0 1 2 3 4 ... N-1 和 stride_y[y] 将包含相似的偏移量乘以原始行宽 0 N 2*N 3*N..

从这些一维数组中,可以更轻松地删除或交换完整的行和列,这可能会派上用场,例如。行列式计算/高斯乔丹消除的递归实现。

于 2013-03-08T06:40:07.470 回答
1

就像 Code-guru 说 malloc() 和 free() 应该有很大帮助,但如果你只是想删除最后一列,你就不需要两个数组:

double matrix[2][3] = {1,2,3,4,5,6}; //declaring a 2 by 3 matrix 



for (i=0;i<2;i++) //rows
{   
    for (j=0;j<3-1;j++) //columns - 1
    {
        printf("%.1f ",matrix[i][j]); //I chose to display matrix...
    }
    printf("\n");
}
于 2013-03-08T02:17:14.950 回答