我有一个动态,正确分配的方阵矩阵
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
我试图记下并测试许多算法,但没有成功。 我该怎么办?
答案 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_WIDTH
和MATRIX_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];
}
}
}