你如何在矩阵中交换两行(在C中)?

use*_*360 6 c swap row matrix

例如,给定一个矩阵:

1 2 3

4 5 6

7 8 9

如果你是goint交换行[0]和行[1],结果矩阵将是:

4 5 6

1 2 3

7 8 9

你能帮助我在C中获取代码吗?

dmc*_*kee 18

答案完全取决于你的"矩阵"是如何实现的,因为c语言没有这种东西的概念.

你在使用二维数组吗?

double m[3][3];
Run Code Online (Sandbox Code Playgroud)

或者是其他东西?

二维数组

您必须手动移动单个元素.

for (i=0; i<ROWLENGTH; ++i){
  double temp;
  temp = m[r2][i];
  m[r2][i] = m[r1][i];
  m[r1][i] = temp;
}
Run Code Online (Sandbox Code Playgroud)

(这里r1r2是已被设置为你希望交换的两排整数)或看到詹姆斯的memcpy实施可能会更快但需要整行的临时记忆.

衣衫褴褛的阵列

如果此操作非常常见且分析显示它耗费了大量时间,则可以考虑使用矩阵的不规则数组实现.像这样的东西:

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 */
}
Run Code Online (Sandbox Code Playgroud)

关于此结构的有趣部分是您仍然可以使用[][]表示法访问它,但行交换操作变为

double *temp;
temp = m[r2];
m[r2] = m[r1];
m[r1] = temp;
Run Code Online (Sandbox Code Playgroud)

从您的角度来看,褴褛阵列有两个缺点(好吧,三个原因导致内存管理麻烦):它们需要额外的行存储指针存储,并且您不能使用内联初始化.

行AS-astructure

C不支持表单的数组赋值;

double r[3], q[3] = { 1, 2, 3 };
r = q; /* ERROR */
Run Code Online (Sandbox Code Playgroud)

但它确实支持结构的值赋值语义.这为您提供了几个人建议的实现而没有解释:

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;
Run Code Online (Sandbox Code Playgroud)

这是光滑的.它需要一整行内存,但如果编译器有任何好处可能很快.最大的缺点是你不能再用[][]语法来处理单个矩阵元素.相反,你写m[i].r[j];

其他

在c中实现"矩阵"有许多其他方法,但它们通常更复杂,仅在特殊情况下有用.当你需要它们时,你将能够在每个问题的背景下为自己回答这些问题.


Jam*_*ran 7

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));
Run Code Online (Sandbox Code Playgroud)