kumar_11 Ответов: 2

Можно ли найти транспонирование матрицы без использования дополнительного массива.Я имею в виду, что в приведенной ниже программе, если мне не нужно использовать массив Transpose [] [], то как я могу найти решение?


#include< stdio.h >

int main()
{
    int m, n, c, d, matrix[10][10], transpose[10][10];

    printf ("Enter the number of rows and columns of matrix: \n");
    scanf ("%d%d",&m,&n);
    printf ("Enter the elements of matrix: \n");

    for(c = 0; c < m; c++)
    {
        for(d = 0; d < n; d++)
        {
            scanf("%d",&matrix[c][d]);
        }
    }

    for(c = 0; c < m; c++)
    {
        for(d = 0; d < n; d++)
        {
            transpose[d][c] = matrix[c][d];
        }
    }

    printf("Transpose of entered matrix: \n");

    for(c = 0; c < n; c++)
    {
        for(d = 0; d < m; d++)
        {
            printf("%d\t",transpose[c][d]);
        }
        printf("\n");
    }

    return 0;
}

2 Ответов

Рейтинг:
2

enhzflep

Конечно, это так. Ты так близко!

Просто помните, что на самом деле включает в себя транспозиция матрицы - она включает в себя отражение элементов поперек диагональной оси, которая проходит сверху слева вниз справа.

То есть:

[0 1]    [0 2]
[2 3]    [1 3]

[0 1 2]  [0 3 6]
[3 4 5]  [1 4 7]
[6 7 8]  [2 5 8]


В каждом случае индексами строки и столбца элемента являются обмененный если только индекс строки = = индекс столбца.

Таким образом, вам просто нужна одна временная переменная любого типа, который содержит ваша матрица. Это просто серия (N^2 - N) операций подкачки, где N - количество строк или столбцов, предполагающих квадратную матрицу.

Поместите содержимое [строки][столбца] в tmpVal
Установить содержание [строка][столбец], чтобы быть [столбец][строка]
Установите содержимое [столбца][строки] равным tmpVal

Естественно, это не учитывает тот факт, что нам не нужно копировать элементы, если column==row. На самом деле, вероятно, быстрее просто прорваться, никогда не сравнивая столбец и строку. Есть относительно мало элементов, для которых это будет верно - в худшем случае 50%, когда у вас есть матрица 2x2-или для матрицы 10x10, это будет 10 элементов. Это можно вычислить(для квадратной матрицы) по N/(N^2), так что по мере увеличения матрицы потенциальная экономия становится все меньше.

Тем не менее, если вы попытаетесь сделать эту "оптимизацию", вы обнаружите, что сравниваете строку со столбцом для 100% элементов.


kumar_11

Я действительно ценю ваш способ прояснить ситуацию.
Только одно мое сомнение: выполнимо ли это там, где условие возникает как raw!=column.

enhzflep

Это нормально, вы действительно Добро пожаловать.

Сэндвич с тунцом менее ценен, чем урок рыбной ловли. Бутерброд с тунцом и урок рыбной ловли часто могут быть еще лучше!

Да, это выполнимо, когда row != column, на самом деле-единственный раз, когда вам нужно поменять местами, это когда row != column. Это будет быстрее поменять местами независимо от того, является ли row= = column или нет (без условного ветвления или остановки конвейера).

Поскольку [1][1] всегда будет [1] [1], а [2] [2] всегда будет [2] [2], Вы можете безопасно поменять [row=1] [column=1] на [column=1] [row=1] и т. д.

Наверное, вам лучше пока забыть об этом упоминании об оптимизации. Это только сделает код менее понятным для чтения, и очень, очень мало пользы. Часто оптимизированный код труднее читать, чем неверный, но просто реализованный код.

kumar_11

Большое вам спасибо за ответ.
Я прошу вас написать код здесь, потому что я так старался, но все равно не получил результата.

enhzflep

Код или этого не произошло! :p

Если вы добавите то, что уже пробовали, я постараюсь направить вас дальше.

kumar_11

Вот что я написал, пожалуйста, поправьте меня, где я ошибаюсь.

enhzflep

Ах хах! Знаешь, мне только что кое-что пришло в голову.

Я предполагаю, что ваша "транспонированная" матрица выглядит точно так же, как и Ваша исходная матрица, верно?
Я совершенно упустил из виду кое-что раньше, я так устал. Честно говоря, я чувствую себя немного глупо.

Каждый элемент обменивается дважды..
Например
Строку 1 столбца 3 сбрасываются в строке 3, столбце 1
потом позже,
Строка 3, столбец 1 заменяется строкой 1, столбец 3

Вам просто нужно изменить верхний предел вашего цикла через каждый столбец.

вместо того, чтобы покрывать всю матрицу, нам нужно покрыть только нижний левый угол или верхнюю правую половину.

Итак, в вашем цикле обмена -

запустите (j=0; j< j++), как вы уже это делаете.

но вместо того, чтобы бежать через i=0 к i=n, бегите от i=0 к i=j. Исправлено!

kumar_11

Позвольте мне попробовать, тогда я смогу рассказать вам все, что угодно.

Member 9863088

не сработало :/

Рейтинг:
0

Member 13460419

// транспонирование матрицы 12/10/2017 Ашу Джайн
#include< stdio.h>
тап_п()
{
int arr[10][10], i, j, row, col, temp;
printf ("сколько строк и столбцов вы хотите взять");
то scanf("%д %д",&ампер;подряд&ампер;кол);
printf ("введите элементы матрицы");
for (i=0;i< row; i++)
для(j=0;j< col; j++)
scanf("%d",& arr[i][j]);
printf ("транспонирование матрицы-это\n");
if (row< col)
{
for (i=0;i< row; i++)
для(j=0;j< col; j++)
{

если (i< j)
{
temp=arr[i][j];
модуль arr[я][Дж]=ОБР[Дж][я];
arr[j][i]=temp;
}
}}
еще

for (i=0;i< row; i++)
для(j=0;j< col; j++)
{

если (i> j)
{
temp=arr[i][j];
модуль arr[я][Дж]=ОБР[Дж][я];
arr[j][i]=temp;
}}
для (i=0;i< col; i++)
{
для(j=0;j< row; j++)
printf ("%d", arr[i][j]);
printf ("\n");
}
}


Richard Deeming

Даже если мы проигнорируем тот факт, что этот вопрос был задан, дан ответ и решен ЧЕТЫРЕ ГОДА НАЗАД, неформатированный дамп кода-это не решение!