gpt4 book ai didi

c - 奇数行反转矩阵转置

转载 作者:行者123 更新时间:2023-11-30 20:59:53 24 4
gpt4 key购买 nike

我知道如何转置矩阵,但是如何转置奇数行反转形式的矩阵。

3*3 矩阵示例

  • 1 2 3
  • 4 5 6
  • 7 8 9

输出

  • 1 6 7
  • 2 5 8
  • 3 4 9

最佳答案

这是一个将问题分解为更小的子问题的解决方案。函数 reverse_row() 是一个就地反转数组的函数,函数 transpose_array() 就地转置数组。

第一个函数 reverse_row() 在具有奇数索引的二维数组的行上循环调用,然后在结果数组。请注意,测试 if (i % 2) {} 用于确定数组索引是奇数还是偶数,因为 i % 2 的计算结果为 0 仅当 i 为偶数时;您也可以避免此测试,只需在每次迭代时将 i 加 2(从 1 开始),如 @Lưu Vĩnh Phúc 所建议的那样。在评论中:

for (size_t i = 1; i < MATRIX_SZ; i += 2) {
reverse_row(MATRIX_SZ, array[i]);
}

另请注意,要转置方阵,您不需要迭代所有元素,而只需迭代对角线上方或下方的元素,并与适当的元素交换。在这种情况下,我选择迭代对角线下方的元素,与对角线上方的相应元素交换。当然,对角线上的元素保持不变,因此根本不会迭代。

这是代码,使用 4X4 数组作为输入。该代码适用于方阵,并且可以适用于矩形矩阵。这需要谨慎选择用于表示矩阵的数组大小或动态分配。

#include <stdio.h>

#define MATRIX_SZ 4

void print_array(size_t n, int arr[n][n]);
void reverse_row(size_t n, int arr[n]);
void transpose_array(size_t n, int arr[n][n]);

int main(void)
{
int array[MATRIX_SZ][MATRIX_SZ] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };

puts("Before transformation:");
print_array(MATRIX_SZ, array);
putchar('\n');

for (size_t i = 0; i < MATRIX_SZ; i++) {
if (i % 2) {
reverse_row(MATRIX_SZ, array[i]);
}
}
transpose_array(MATRIX_SZ, array);

puts("After transformation:");
print_array(MATRIX_SZ, array);
putchar('\n');

return 0;
}

void print_array(size_t n, int arr[n][n])
{
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < n; j++) {
printf("%5d", arr[i][j]);
}
putchar('\n');
}
}

void reverse_row(size_t n, int arr[n])
{
size_t mid = n / 2;
for (size_t i = 0; i < mid; i++) {
size_t swap_dx = n - 1 - i;
int temp = arr[i];
arr[i] = arr[swap_dx];
arr[swap_dx] = temp;
}
}

void transpose_array(size_t n, int arr[n][n])
{
for (size_t i = 0; i < n; i++) {
for (size_t j = 0; j < i; j++) {
int temp = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = temp;
}
}
}

这是程序输出:

Before transformation:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

After transformation:
1 8 9 16
2 7 10 15
3 6 11 14
4 5 12 13

关于c - 奇数行反转矩阵转置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44665351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com