Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2020 mgr Jerzy Wałaszek
I LO w Tarnowie

Transponowanie macierzy

SPIS TREŚCI
Tematy pomocnicze
Podrozdziały

Problem

Należy transponować macierz A m × n na A T n × m.

Transponowanie macierzy prostokątnej

Operacja transponowania macierzy polega na zamianie wierszy w kolumny i kolumn w wiersze. Operację transponowania oznaczamy literką T. Ponieważ kolumny i wiersze wymieniają się wzajemnie, macierz transponowana posiada n  wierszy i m  kolumn.

Przykład:

  3 6 3  
  1 7 2  
  4 2 0  
  3 3 1  
T =
  3 1 4 3  
  6 7 2 3  
  3 2 0 1  

Algorytm transponowania macierzy

Wejście:

m  –  liczba wierszy macierzy, m  ∈ N
n  – liczba kolumn macierzy, n  ∈ N
A  – macierz do transponowania o m  wierszach i n  kolumnach, A  ∈ R
B  – macierz wynikowa o n  wierszach i m  kolumnach, B  ∈ R

Wyjście:

Macierz B = A T

Zmienne pomocnicze:

i w  –  indeks wierszowy macierzy, i w  ∈ N
i k  – indeks kolumnowy macierzy, i k  ∈ N

Lista kroków:

K01: Dla i w  = 1, 2, ..., m :
wykonuj krok K02
K02:     Dla i k  = 1, 2, ..., n :
    wykonuj:
        B [ i k, i w  ] ←  A [ i w, i k  ]
K04: Zakończ

Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Program generuje losowe liczby m  i n ( od 2 do 8 ). Następnie tworzy macierz A m  × n oraz macierz B n  × m. Macierz A  jest wypełniana losowymi liczbami z zakresu od -99 do 99, wyświetlana i transponowana w macierzy B. Na koniec program wyświetla zawartość macierzy B.
Pascal
// Transponowanie macierzy
// Data: 11.01.2010
// (C)2020 mgr Jerzy Wałaszek
//-----------------------------

program mtranspose;

type
  NInt = array of integer; // typ tablic wierszy
  MInt = array of NInt;    // typ tablicy wskaźników

var
  A, B : MInt;
  n, m, iw, ik : integer;

begin

  Randomize;

  // losujemy wymiary macierzy

  m := random ( 7 ) + 2;
  n := random ( 7 ) + 2;

  // tworzymy tablicę wskaźników

  SetLength ( A, m );
  SetLength ( B, n );

  // tworzymy tablice wierszy

  for iw := 0 to m - 1 do SetLength ( A [ iw ], n );
  for iw := 0 to n - 1 do SetLength ( B [ iw ], m );

  // wypełniamy macierz A losowymi liczbami

  for iw := 0 to m - 1 do
    for ik := 0 to n - 1 do
      A [ iw ][ ik ] := random ( 199 ) - 99;

  // wyświetlamy macierz A

  writeln ( 'm = ', m );
  writeln ( 'n = ', n );
  writeln;
  writeln ( 'Matrix A:' );

  for iw := 0 to m - 1 do
  begin
    for ik := 0 to n - 1 do write ( A [ iw ][ ik ] :5 );
    writeln;
  end;

  // transponujemy macierz A w B

  for iw := 0 to m - 1 do
    for ik := 0 to n - 1 do
      B [ ik ][ iw ] := A [ iw ][ ik ];

  // wyświetlamy macierz wynikową

  writeln;
  writeln ( 'Matrix B = AT:' );

  for iw := 0 to n - 1 do
  begin
    for ik := 0 to m - 1 do write ( B [ iw ][ ik ] :5 );
    writeln;
  end;

  // koniec, zwalniamy pamięć zajętą przez macierze

  for iw := 0 to m - 1 do SetLength ( A [ iw ], 0 );
  for iw := 0 to n - 1 do SetLength ( B [ iw ], 0 );

  SetLength ( A, 0 );
  SetLength ( B, 0 );

end.
C++
// Transponowanie macierzy
// Data: 11.01.2010
// (C)2020 mgr Jerzy Wałaszek
//-----------------------------

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>

using namespace std;

int main( )
{
  int **A, **B, n, m, iw, ik;

  srand ( ( unsigned )time ( NULL ) );

  // losujemy wymiary macierzy

  m = rand( ) % 7 + 2;
  n = rand( ) % 7 + 2;

  // tworzymy tablicę wskaźników

   A = new int * [ m ];
   B = new int * [ n ];

  // tworzymy tablice wierszy

  for( iw = 0; iw < m; iw++ ) A [ iw ] = new int [ n ];
  for( iw = 0; iw < n; iw++ ) B [ iw ] = new int [ m ];

  // wypełniamy macierz A losowymi liczbami

  for( iw = 0; iw < m; iw++ )
    for( ik = 0; ik < n; ik++ ) A [ iw ][ ik ] = rand( ) % 199 - 99;

  // wyświetlamy macierz A

  cout << "m = " << m << endl
       << "n = " << n << endl << endl
       << "Matrix A:" << endl;

  for( iw = 0; iw < m; iw++ )
  {
    for( ik = 0; ik < n; ik++ ) cout << setw ( 5 ) << A [ iw ][ ik ];
    cout << endl;
  }
  
  // transponujemy macierz A w B
  
  for( iw = 0; iw < m; iw++ )
    for( ik = 0; ik < n; ik++ ) B [ ik ][ iw ] = A [ iw ][ ik ];

  // wyświetlamy macierz wynikową

  cout << endl << "Matrix B = AT:" << endl;
  
  for( iw = 0; iw < n; iw++ )
  {
    for( ik = 0; ik < m; ik++ ) cout << setw ( 5 ) << B [ iw ][ ik ];
    cout << endl;
  }

  // koniec, zwalniamy pamięć zajętą przez macierze

  for( iw = 0; iw < m; iw++ ) delete [ ] A [ iw ];
  for( iw = 0; iw < n; iw++ ) delete [ ] B [ iw ];
  delete [ ] A;
  delete [ ] B;

  return 0;
}
Basic
' Transponowanie macierzy
' Data: 11.01.2010
' (C)2020 mgr Jerzy Wałaszek
'-----------------------------

Dim As Integer n, m, iw, ik

Randomize

' losujemy wymiary macierzy

m = Int ( Rnd ( 1 ) * 7 ) + 2
n = Int ( Rnd ( 1 ) * 7 ) + 2

' tworzymy macierze

Dim As Integer A ( 1 To m, 1 To n ), B ( 1 To n, 1 To m )

' wypełniamy macierz A losowymi liczbami

For iw = 1 To m
  For ik = 1 To n
    A ( iw, ik ) = Int ( Rnd ( 1 ) * 199 ) - 99
  Next
Next

' wyświetlamy macierz A

Print "m = ";m
Print "n = ";n
Print
Print "Matrix A:"

For iw = 1 To m
  For ik = 1 To n
    Print Using "#####";A ( iw, ik );
  Next
  Print
Next

' transponujemy macierz A w B

For iw = 1 To m
  For ik = 1 To n
    B ( ik, iw ) = A ( iw, ik )
  Next
Next

' wyświetlamy macierz wynikową

Print
Print "Matrix B = AT:"

For iw = 1 To n
  For ik = 1 To m
    Print Using "#####";B ( iw, ik );
  Next
  Print
Next

End
Wynik:
m = 7
n = 5

Matrix A:
   72   19   63   92   24
  -76   21  -14   91   -7
  -30  -29  -75   76  -24
  -44  -90   29  -32   43
   99   25   22   97   39
  -39  -46   55   93   63
  -48   64   -1   33  -16

Matrix B = AT:
   72  -76  -30  -44   99  -39  -48
   19   21  -29  -90   25  -46   64
   63  -14  -75   29   22   55   -1
   92   91   76  -32   97   93   33
   24   -7  -24   43   39   63  -16
Transponowanie macierzy
(C)2020 mgr Jerzy Wałaszek

 

.

Na początek:  podrozdziału   strony 

Problem

Należy transponować macierz kwadratową A n × n w miejscu.

Transponowanie macierzy kwadratowej

Podany powyżej algorytm transponowania macierzy wymaga dodatkowej pamięci. Jeśli macierz jest kwadratowa, to możemy transponować ją w miejscu. zamieniając miejscami elementy kolumn i wierszy. Zasada jest następująca:

Załóżmy, iż mamy transponować poniższą macierz stopnia 4:

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

Zwróć uwagę, iż dla macierzy kwadratowej główna przekątna pozostaje bez zmian po transponowaniu. Elementy leżące na głównej przekątnej nie musimy przemieszczać. W pierwszym kroku wymienimy zatem elementy pierwszej kolumny i pierwszego wiersza z pominięciem elementu 1, który leży właśnie na głównej przekątnej:

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

Po wykonaniu tej operacji pierwsza kolumna i pierwszy wiersz macierzy są gotowe. Nie będziemy ich już zmieniać. W drugim kroku wykonujemy identyczną operację, lecz na pozostałej części macierzy, tzn. z pominięciem pierwszego wiersza i pierwszej kolumny:

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

W efekcie dwa pierwsze wiersze i dwie pierwsze kolumny macierzy są gotowe. Operację kontynuujemy z pozostałą częścią macierzy:

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

Operacja jest zakończona, ponieważ pozostała część macierzy jest już macierzą jednoelementową ( zawiera tylko element 16 ), a transpozycja macierzy jednoelementowej jest tożsamościowa.

Algorytm transponowania macierzy kwadratowej w miejscu

Wejście:

n  – stopień macierzy, n  ∈ N
A  – kwadratowa macierz do transponowania stopnia n, A  ∈ R

Wyjście:

Macierz A = A T

Zmienne pomocnicze:

i, j  –  indeksy, i, j  ∈ N

Lista kroków:

K01: Dla i  = 1, 2, ..., n  - 1:
wykonuj krok K02
K02:     Dla j  = i  = 1, i  = 2, ..., n :
    wykonuj:
        A [ i, j  ] ↔ A [ j, i  ]
K03: Zakończ

Przykładowe programy

Uwaga:

Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich.

Program generuje losowy stopień macierzy n ( od 2 do 8 ). Następnie tworzy macierz kwadratową A n  × n, którą wypełnia losowymi liczbami z zakresu od -99 do 99. Macierz A  zostaje wyświetlona i transponowana. Na koniec program wyświetla ponownie zawartość macierzy A.
Pascal
// Transponowanie macierzy kwadratowej
// Data: 11.01.2010
// (C)2020 mgr Jerzy Wałaszek
//-----------------------------

program mtranspose2;

type
  NInt = array of integer; // typ tablic wierszy
  MInt = array of NInt;    // typ tablicy wskaźników

var
  A : MInt;
  n, i, j, t : integer;

begin

  Randomize;

  // losujemy stopień macierzy

  n := random ( 7 ) + 2;

  // tworzymy tablicę wskaźników

  SetLength ( A, n );

  // tworzymy tablice wierszy

  for i := 0 to n - 1 do SetLength ( A [ i ], n );

  // wypełniamy macierz A losowymi liczbami

  for i := 0 to n - 1 do
    for j := 0 to n - 1 do 
      A [ i ][ j ] := random ( 199 ) - 99;

  // wyświetlamy macierz A

  writeln ( 'n = ', n );
  writeln;
  writeln ( 'Matrix A:' );

  for i := 0 to n - 1 do
  begin
    for j := 0 to n - 1 do write ( A [ i ][ j ] :5 );
    writeln;
  end;

  // transponujemy macierz A

  for i := 0 to n - 2 do
    for j := i + 1 to n - 1 do
    begin
      t := A [ i ][ j ];
      A [ i ][ j ] := A [ j ][ i ];
      A [ j ][ i ] := t;
    end;

  // wyświetlamy macierz A

  writeln;
  writeln ( 'Matrix AT:' );

  for i := 0 to n - 1 do
  begin
    for j := 0 to n - 1 do write ( A [ i ][ j ] :5 );
    writeln;
  end;

  // koniec, zwalniamy pamięć zajętą przez macierz

  for i := 0 to n - 1 do SetLength ( A [ i ], 0 );

  SetLength ( A, 0 );
 
end.
C++
// Transponowanie macierzy kwadratowej
// Data: 11.01.2010
// (C)2020 mgr Jerzy Wałaszek
//-----------------------------

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>

using namespace std;

main( )
{
  int **A, n, i, j, t;

  srand ( ( unsigned )time ( NULL ) );

  // losujemy stopień macierzy

  n = rand( ) % 7 + 2;

  // tworzymy tablicę wskaźników

   A = new int * [ n ];

  // tworzymy tablice wierszy

  for( i = 0; i < n; i++ ) A [ i ] = new int [ n ];

  // wypełniamy macierz A losowymi liczbami

  for( i = 0; i < n; i++ )
    for( j = 0; j < n; j++ ) A [ i ][ j ] = rand( ) % 199 - 99;

  // wyświetlamy macierz A

  cout << "n = " << n << endl << endl
       << "Matrix A:" << endl;

  for( i = 0; i < n; i++ )
  {
    for( j = 0; j < n; j++ ) cout << setw ( 5 ) << A [ i ][ j ];
    cout << endl;
  }
  
  // transponujemy macierz A
  
  for( i = 0; i < n - 1; i++ )
    for( j = i + 1; j < n; j++ )
    {
      t = A [ i ][ j ];
      A [ i ][ j ] = A [ j ][ i ];
      A [ j ][ i ] = t;
    }

  // wyświetlamy macierz A

  cout << endl << "Matrix AT:" << endl;
  
  for( i = 0; i < n; i++ )
  {
    for( j = 0; j < n; j++ ) cout << setw ( 5 ) << A [ i ][ j ];
    cout << endl;
  }

  // koniec, zwalniamy pamięć zajętą przez macierz

  for( i = 0; i < n; i++ ) delete [ ] A [ i ];
  delete [ ] A;
}
Basic
' Transponowanie macierzy kwadratowej
' Data: 11.01.2010
' (C)2020 mgr Jerzy Wałaszek
'-----------------------------

Dim As Integer n, m, i, j

Randomize

' losujemy stopień macierzy

n = Int ( Rnd ( 1 ) * 7 ) + 2

' tworzymy macierz

Dim As Integer A ( 1 To n, 1 To n )

' wypełniamy macierz A losowymi liczbami

For i = 1 To n
  For j = 1 To n
    A ( i, j ) = Int ( Rnd ( 1 ) * 199 ) - 99
  Next
Next

' wyświetlamy macierz A

Print "n = ";n
Print
Print "Matrix A:"

For i = 1 To n
  For j = 1 To n
    Print Using "#####";A ( i, j );
  Next
  Print
Next

' transponujemy macierz A

For i = 1 To n - 1
  For j = i + 1 To n
    Swap A ( i, j ), A ( j, i )
  Next
Next

' wyświetlamy macierz wynikową

Print
Print "Matrix AT:"

For i = 1 To n
  For j = 1 To n
    Print Using "#####";A ( i, j );
  Next
  Print
Next

End
Wynik:
n = 7

Matrix A:
   87  -16   39   12    1   89  -49
   27  -29  -86  -26    8    0  -87
  -77  -57   25  -91   52   35    1
   67   21   43   56  -25   28   91
  -31   -1   67   70  -47   23   84
   16    2  -50  -21    2   11  -82
  -42   93   -1  -17   21   57  -65

Matrix AT:
   87   27  -77   67  -31   16  -42
  -16  -29  -57   21   -1    2   93
   39  -86   25   43   67  -50   -1
   12  -26  -91   56   70  -21  -17
    1    8   52  -25  -47    2   21
   89    0   35   28   23   11   57
  -49  -87    1   91   84  -82  -65
Transponowanie macierzy kwadratowej
(C)2020 mgr Jerzy Wałaszek

 

.

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2020 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.