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)
(这里r1和r2是已被设置为你希望交换的两排整数)或看到詹姆斯的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)
从您的角度来看,褴褛阵列有两个缺点(好吧,三个原因导致内存管理麻烦):它们需要额外的行存储指针存储,并且您不能使用内联初始化.
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中实现"矩阵"有许多其他方法,但它们通常更复杂,仅在特殊情况下有用.当你需要它们时,你将能够在每个问题的背景下为自己回答这些问题.
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)
| 归档时间: |
|
| 查看次数: |
38848 次 |
| 最近记录: |