Транспонирование матрицы C (порядок строк-мажоров) - PullRequest
0 голосов
/ 19 ноября 2018

Цель состоит в том, чтобы получить транспонирование матрицы, переданной в аргументе.

Я сделал это, но не получил то, что ожидал:

m - это матрица, а r - это место, где хранится результат

void transpose(double m[], size_t rows, size_t cols, double r[])
{
    for (size_t i = 0; i < rows; i += 1)
    {
        for (size_t j = 0; j < cols; j += 1)
        {
            r[j * cols + i] = m[i * rows + j];
        }
    }
}

Когда я его печатаю, только первая строка транспонируется и становится первой колонкой.

Пример:

1 2
3 4

будет:

1 3
2 4

но используя мой код:

1 2
3 4

дает мне:

1 0
2 0

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Как я сказал в комментариях и как указано в ответе 4386427, ваше отображение неверно.

Для демонстрации:

#include <stdio.h>

#define ROW (2)
#define COLUMN (3)

void transpose(double m[], size_t rows, size_t cols, double r[])
{
    for (size_t i = 0; i < rows; i += 1)
    {
        for (size_t j = 0; j < cols; j += 1)
        {
            printf("i = %zu, j = %zu --- Interchanging %lf with %lf\n", i, j, r[j * rows + i], m[i * cols + j]);
            r[j * rows + i] = m[i * cols + j];
        }
    }
}

int main(void)
{
    double m[ROW*COLUMN] = { 1, 2, 3, 4, 5, 6 };
    double n[COLUMN*ROW] = { 7, 8, 9, 10, 11, 12 };

    /*       
     *  m -> 1 2 3
     *       4 5 6
     * 
     *  n -> 7  8
     *       9  10
     *       11 12
     */

    transpose(m, ROW, COLUMN, n);
    printf("\nTranspose of matrix m is (in 1D form):\n");

    for(int i = 0; i < ROW*COLUMN; i++)
    {
        printf("%lf ", n[i]);
    }

    printf("\n");
    return 0;
}

Я также инициализировал вторую матрицу, чтобы увидеть, какое число идет куда.

Выход:

[root@localhost little_programs]# gcc -Wall -std=c99 -o matrix_T matrix_T.c
[root@localhost little_programs]# ./matrix_T
i = 0, j = 0 --- Interchanging 7.000000 with 1.000000
i = 0, j = 1 --- Interchanging 9.000000 with 2.000000
i = 0, j = 2 --- Interchanging 11.000000 with 3.000000
i = 1, j = 0 --- Interchanging 8.000000 with 4.000000
i = 1, j = 1 --- Interchanging 10.000000 with 5.000000
i = 1, j = 2 --- Interchanging 12.000000 with 6.000000

Transpose of matrix m is (in 1D form):
1.000000 4.000000 2.000000 5.000000 3.000000 6.000000

Тщательно осмотрите, что происходит на каждом шаге цикла, и вы увидите, что пошло не так.

0 голосов
/ 19 ноября 2018

Эта строка

r[j * cols + i] = m[i * rows + j];

неверна.Попробуйте:

r[j * rows + i] = m[i * cols + j];

, так как это число столбцов, которое дает расстояние между строками.

...