2013-03-08 6 views
2

Я застрял здесь. У меня есть матрица размера NxN, хранящаяся в двойном массиве. Затем я хочу удалить данный столбец, скажем, первый столбец. Поэтому я создал новый двойной массив размером NxN-1 и скопировал значения из первой матрицы во вторую, за исключением, конечно, 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? 

ответ

2

Вы не можете назначать массивы в C, которые я предполагаю, что ваш компилятор сообщает вам. Чтобы сделать такое управление динамической памятью, вам нужно будет использовать указатели вместо массивов. Я предлагаю вам прочитать, как работают malloc() и free(), чтобы вы могли делать то, что хотите.

Edit:

Другое решение приходит на ум, если вы только удаление столбцов (или строк): следить за количеством строк и столбцов, используемых в массиве. Затем вы можете удалить строку или столбец в исходном массиве, не создавая сначала копию. Просто переместите данные за столбец удаления (или строку) влево (или вверх), а затем уменьшите счетчики размера. (Надеюсь, это будет иметь смысл. Если я не дам знать, и я уточню.)

+0

Хорошо, если я динамически выделяю массив, тогда, когда я хочу удалить первый столбец, я могу просто сдвинуть значения, а затем освободить последний столбец. Это звучит как правильная логика? –

+0

@jimjohnjim Возможно, вы сможете сделать что-то подобное в зависимости от того, как вы распределяете массив. Вы хотите удалить только столбцы или удалите строки? –

+0

Мне нужно иногда удалять столбцы и удалять строки в другое время. Итак, чтобы удалить последнюю строку, я могу просто освободить (матрица [ROW-1]) правильно? Но то же самое не относится к столбцу, потому что каждая строка имеет последний столбец. Поэтому я пытаюсь, как только все сдвинется, перераспределите каждую матрицу [i] на 1 размер меньше. Имеет ли это смысл? –

1

как Code-гуру сказал, что malloc() и free() должны помочь alot, но если вы просто хотели удалить последний столбец, Вам не нужны два массива:

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

Вместо доступа к элементам из массива [я] [J], можно выбрать, чтобы получить доступ к элементам из array + stride_x[x] + stride_y[y]; где массив изначально вводится как 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-мерных массивов можно более легко удалить или обменять полные строки и столбцы, что может пригодиться, например. рекурсивная реализация детерминантного расчета/исключение Гаусса Джордана.

Смежные вопросы