Solución:
La respuesta depende completamente de cómo se implemente su “matriz”, porque el lenguaje c no tiene noción de tal cosa.
¿Está utilizando matrices bidimensionales?
double m[3][3];
¿O algo mas?
Matrices bidimensionales
Tendrá que mover elementos individuales a mano.
for (i=0; i<ROWLENGTH; ++i){
double temp;
temp = m[r2][i];
m[r2][i] = m[r1][i];
m[r1][i] = temp;
}
(aquí r1
y r2
son entradas que se han establecido en las dos filas que desea intercambiar) o ver James memcpy
implementación que bien puede ser más rápida, pero requiere filas enteras de memoria temporal.
Matrices irregulares
Si esta operación es muy común y la generación de perfiles revela que está consumiendo mucho tiempo, podría considerar usar una implementación de matriz irregular de la matriz. Algo como esto:
double **m;
m = malloc(sizeof(double*)*NUMROWS);
/* put error checking here */
for (i=0; i<NUMROWS; ++i){
m[i] = malloc(sizeof(double)*ROWLENGTH);
/* error checking again */
}
La parte divertida de esta estructura es que aún puede acceder a ella con el [][]
notación, pero la operación de intercambio de filas se convierte en
double *temp;
temp = m[r2];
m[r2] = m[r1];
m[r1] = temp;
Los arreglos irregulares tienen dos desventajas desde su punto de vista (bueno, tres debido a la molestia de la administración de la memoria): requieren almacenamiento adicional para los punteros de fila y no puede usar la inicialización en línea.
Fila como estructura
C no admite asignaciones de matriz del formulario;
double r[3], q[3] = { 1, 2, 3 };
r = q; /* ERROR */
pero lo hace Apoyar la semántica de asignación por valor para estructuras. Lo que le da la implementación que varias personas han sugerido sin explicar:
typedef struct { double r[ROWLENGTH] } row;
row m[NUMROWS] = { {1, 2, 3}, {4, 5, 6}, {7, 8 9}};
row temp = m[2];
m[2] = m[1];
m[1] = temp;
que es resbaladizo. Requiere una fila completa de memoria, pero si el compilador es bueno, probablemente sea rápido. La gran desventaja es que no puede abordar elementos individuales de la matriz con el [][]
sintaxis más. Más bien escribes m[i].r[j]
;
Otros
Hay muchas, muchas otras formas de implementar una “matriz” en c, pero en su mayoría son mucho más complicadas y útiles solo en situaciones especializadas. Cuando las necesite, podrá responder estas preguntas por sí mismo en el contexto de cada una.
typedef int Row[3];
Row Matrix[3];
Row Temp;
memcpy(Temp, Matrix[0], sizeof(Row));
memcpy(Matrix[0], Matrix[1], sizeof(Row));
memcpy(Matrix[1], Temp, sizeof(Row));
Probablemente cambiaría un elemento a la vez para evitar usar mucho almacenamiento adicional. Si está trabajando principalmente con cosas como transformaciones gráficas donde las matrices son típicamente 3×3 o 4×4, el enfoque de James Curran es probablemente Un poco mejor. Si está (o podría estar) trabajando con matrices realmente grandes, esto ahorrará memoria y posiblemente se ejecutará más rápido:
int x[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
for (int i=0; i<3; i++) {
int temp = x[0][i];
x[0][i] = x[1][i];
x[1][i] = temp;
}