删除C中方阵中的列和行

时间:2015-06-08 15:25:44

标签: c matrix

我有一个动态,正确分配的方阵矩阵

double **matrix;

我想删除" x"行和" x"该矩阵中的列,方式如下:

SOURCE MATRIX:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

我想删除第二行/列。输出必须是这样的:

FINAL MATRIX:
1 3 4
9 11 12
13 15 16

我试图记下并测试许多算法,但没有成功。 我该怎么办?

3 个答案:

答案 0 :(得分:1)

嗯,要做到这一点,你必须意识到在内存中你的矩阵实际上是一个列表列表。 这意味着删除列与删除行略有不同:

假设您的语法为matrix[row][column];

void removeColumn(int** matrix, int col){
  MATRIX_WIDTH--;
  //TODO check for empty matrix etc;
  for(int i=0;i<MATRIX_HEIGHT; i++)
  {
    while(col<MATRIX_WIDTH)
    {
      //move data to the left
      matrix[i][col]=matrix[i][col+1];
      col++;
    }
  matrix[i] = realloc(matrix[i], sizeof(double)*MATRIX_WIDHT);
  }
void removeRow(int** matrix, int row){
  MATRIX_HEIGHT--;
  //TODO check for empty matrix etc.
  free(matrix[row]);
  while(row<MATRIX_HEIGHT)
  {
    //move data up
    matrix[row] = matrix[row+1];
    row++;
  }
}

所以removeColumn遍历每一行,并删除相应的项目,removeRow只能free该行,并覆盖其指针。

请注意,您必须自己跟踪矩阵大小。在示例中,我使用了MATRIX_WIDTHMATRIX_HEIGHT,但您必须为此实现一些功能。 (也许是一个宽度高度和指针的结构。)

答案 1 :(得分:0)

由于我正在寻找类似问题的答案,但矩阵存储在线性空间中这里是我的解决方案(我在这里使用列主要顺序,但是如果你正在使用行 - 主要只需要进行微小的改动)

void removeRow(float * arrayToRemove, const int & currentRows, const int & currentCols, const int & row)
{
    auto currDiff = 0;
    auto step = currentRows;
    auto elemNum = currentRows * currentCols;

    for (int i = row, stepCounter = 0; i < elemNum; ++i, ++stepCounter)
    {
        if (stepCounter % step == 0)
        {
            ++currDiff;
        }
        else
        {
            arrayToRemove[i - currDiff] = arrayToRemove[i];
        }
    }
}

void removeCol(float * arrayToRemove, const int & currentRows, const int & currentCols, const int & col)
{
    auto destination = arrayToRemove + (col * currentRows);
    auto source = arrayToRemove + ((col + 1) * currentRows);
    const auto elemsNum = (currentCols - (col + 1)) * currentRows;
    memcpy(destination, source, elemsNum * sizeof(float));
}

答案 2 :(得分:-1)

我要做的是将这个矩阵分成5个区域。 1)要删除的区域。 2)区域“在”删除的索引之前(在示例矩阵中它只是1)。 3)区域“在”删除的索引之后(在矩阵中为11,12,15,16)。 4)和5)剩下的两个“区域”。一个是(3,4)另一个(9,13)

只需为5个区域中的每个区域创建一个条件并进行复制。

double** matrix = (double**)malloc(sizeof(double)*n*n);
//fill in the matrix here
double** copy (double**)malloc(sizeof(double)*(n-1)*(n-1));
int i;
int j;
int deleteNum;  //what ever row you want to delete
for(i = 0; i < n; i++){
    for(j = 0; j < n; j++){
        if(i < deleteNum && j < deleteNum){
            copy[i][j] = matrix[i][j];
        }
        else if(deleteNum == i || deleteNum == j){
             //one of the rows/columns to be deletd
             //basically skip
        }
        else if(i < deleteNum && j > deleteNum){
             copy[i][j-1] = matrix[i][j];
        }
        else if(i > deleteNum && j < deleteNum){
             copy[i-1][j] = matrix[i][j]
        }
        else{
            copy[i-1][j-1] = matrix[i][j];
        }
    }
}