从双数组中删除列

时间:2013-03-08 01:14:43

标签: c arrays matrix

我被困在这里。我有一个大小为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?

3 个答案:

答案 0 :(得分:2)

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

修改

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

答案 1 :(得分: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");
}

答案 2 :(得分:1)

可以选择从array + stride_x[x] + stride_y[y]访问元素,而不是从数组[i] [j]访问元素;其中数组最初是作为double matrix[N*N];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 ..

从这些1-D阵列中,可以更轻松地删除或交换完整的行和列,这可能在例如方便。递归执行行列式计算/ Gauss Jordan消除。