【问题标题】:Delete a column from a double array从双精度数组中删除一列
【发布时间】:2013-02-23 11:16:18
【问题描述】:

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

【问题讨论】:

    标签: c arrays matrix


    【解决方案1】:

    可以选择从array + stride_x[x] + stride_y[y] 访问元素,而不是从array[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..

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

    【讨论】:

      【解决方案2】:

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

      编辑:

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

      【讨论】:

      • 好的,如果我动态分配数组,那么当我想删除第一列时,我可以将值移过来,然后释放最后一列。这听起来像正确的逻辑吗?
      • @jimjohnjim 根据您分配数组的方式,您可能可以执行类似的操作。您只想删除列还是同时删除行?
      • 我有时需要删除列,有时需要删除行。所以要删除最后一行我可以 free(matrix[ROW-1]) 对吗?但同样不适用于列,因为每一行都有最后一列。所以我正在尝试,一旦一切都转移过来,将每个矩阵[i]重新分配到小一号。这有意义吗?
      • @jimjohnjim 一定要设置matrix[ROW-1] = NULL。对于列,您将需要重新分配每一行并复制数据并删除已删除的列。请注意,这一切都需要使用指针来完成,因为您无法重新分配数组。
      【解决方案3】:

      就像 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");
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-09-05
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多