【发布时间】:2017-10-30 16:36:12
【问题描述】:
尝试在一维数组中创建两个矩阵函数(一个用于交换列,一个用于交换行)。显然,它们在结构上是相似的。
void col_swap(int a[], int col1, int col2, int colSize, int rowSize) {
int d[size];
int space = col2 - col1;
for (int i = 0; i < rowSize; i++) {
for (int j = 0; j < colSize; j++) {
if (i == (col1 - 1) || i == (j * (col1-1))) {
d[i+space] = a[i];
} else if (i == (col2 - 1) || i == (j * (col2-1))) {
d[i-space] = a[i];
} else {
d[i] = a[i];
}
}
printf("%d ", d[i]);
if ((i+1) % colSize == 0) {
printf("\n");
}
}
}
是的,矩阵必须是一维数组。这也不能完全发挥作用。
编辑:COL1 和 COL2 分别不是“矩阵的第一列”和“矩阵的第二列”。它们是我们想要切换的矩阵的任意两列。
void row_swap(int a[], int row1, int row2, int rowSize, int colSize) {
for (int i = 0; i < colSize; i++) {
int temp = a[i*rowSize+row1];
a[i*rowSize+row1] = a[i*rowSize+row2];
a[i*rowSize+row2] = temp;
}
for (int i = 0; i < size; i++) {
if (i % colSize == 0) {
printf("\n");
}
printf("%d ", a[i]);
}
}
我有上面的 row_swap 函数,但是当我给它一个矩阵时
1, 4,
2, 3,
3, 2,
4, 1
返回
1, 3
2, 4
3, 1
4, 2
【问题讨论】:
-
c大师可以在这里纠正我,但我很确定二维数组 NxM 在内存中看起来与 NxM 维一维数组完全相同 - 因此可以在两者中访问方式(单支架或双支架,在尺寸范围内)。另外,什么不起作用,你怀疑什么等等? -
@kabanus 你即将被纠正:你在第一部分是正确的,但你的结论是错误的,see this question。我仍然想知道为什么必须使用一维数组来存储矩阵。
-
@FelixPalmen 谢谢。这是在编译器中强制执行的吗?我不知道
C编译器会这么严格。 -
@kabanus 不,这使得它更多成问题,就像许多可能导致未定义行为的 C 代码;)
-
@FelixPalmen 啊,这就是它如此可爱的原因。
标签: c arrays matrix linear-algebra