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

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

Transponowanie macierzy

SPIS TREŚCI
Tematy pomocnicze
Podrozdziały

Problem

Należy transponować macierz A na B = AT.

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 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
 
   
3×4
4×3

Algorytm transponowania macierzy

Wejście:

m : liczba wierszy macierzy; m ∈ N.
n : liczba kolumn macierzy; n ∈ N.
A
 : macierz do transponowania m wierszach n kolumnach; A ∈ R.  Indeksy rozpoczynają się od wartości 1.
B
 : macierz wynikowa n wierszach m kolumnach; B ∈ R.  Indeksy rozpoczynają się od wartości 1.

Wyjście:

Macierz B = AT

Elementy pomocnicze:

iw : indeks wierszowy macierzy; iw ∈ N.  Indeks rozpoczyna się od wartości 1.
ik : indeks kolumnowy macierzy; ik ∈ N.  Indeks rozpoczyna się od wartości 1.

Lista kroków:

K01: Dla iw = 1,2,…,m:
     wykonuj krok K02
K02:   Dla ik = 1,2,…,n:
       wykonuj:
         B[ik,iw] ← A[iw,ik]
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 Am×n oraz macierz Bn×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('Macierz 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('Macierz B = A^T:');

  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 <ctime>

using namespace std;

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

  srand(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
       << "Macierz 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 << "Macierz B = A^T:" << endl;
 
  for(iw = 0; iw < n; iw++)
  {
    for(ik = 0; ik < m; ik++)
      cout << setw(5) << B[iw][ik];
    cout << endl;
  }

  // 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 "Macierz 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 "Macierz B = A^T:"

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

End
Python (dodatek)
# Transponowanie macierzy
# Data: 10.04.2024
# (C)2024 mgr Jerzy Wałaszek
# --------------------------

import random

# wyświetla macierz
#------------------
def mprint(t,x):
    print(t)
    for i in x:
        for j in i:
            print("%5d" % j,end="")
        print()
    print()
    
# losujemy wymiary macierzy

m = random.randrange(2,9)
n = random.randrange(2,9)

# tworzymy macierze A i B

A = []
for i in range(m):
    a = []
    for j in range(n):
        a.append(random.randrange(-99,100))
    A.append(a)
B = []
for i in range(n):
    a = []
    for j in range(m):
        a.append(0)
    B.append(a)

# wyświetlamy macierz A

print("m =",m)
print("n =",n)
print()
mprint("Macierz A:",A)

# transponujemy macierz A w B

for iw in range(m):
    for ik in range(n):
      B[ik][iw] = A[iw][ik];

# wyświetlamy macierz wynikową

mprint("Macierz B = A^T",B)

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

del A,B,a
Wynik:
m = 3
n = 5

Macierz A:
  -28   97  -82   62  -43
   16   58  -47    5  -80
  -49  -52   78  -61  -91

Macierz B = A^T
  -28   16  -49
   97   58  -52
  -82  -47   78
   62    5  -61
  -43  -80  -91

Transponowanie macierzy
(C)2020 mgr Jerzy Wałaszek

.


Na początek:  podrozdziału   strony 

Problem

Należy transponować macierz kwadratową An×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. Indeksy rozpoczynają się od wartości 1.

Wyjście:

Macierz A = AT

Elementy 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ą An×n, którą wypełnia losowymi liczbami z zakresu od -99 do 99. Macierz A zostaje wyświetlona, transponowana, po czym program wyświetla macierz wynikową 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('Macierz 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('Macierz A^T:');

  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 <ctime>

using namespace std;

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

  srand(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
       << "Macierz 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++)
      swap(A[i][j],A[j][i]);

  // wyświetlamy macierz A

  cout << endl << "Macierz A^T:" << 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 "Macierz 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 "Macierz A^T:"

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

End
Python (dodatek)
# Transponowanie macierzy kwadratowej
# Data: 10.04.2024
# (C)2024 mgr Jerzy Wałaszek
# --------------------------

import random

# wyświetla macierz
#------------------
def mprint(t,x):
    print(t)
    for i in x:
        for j in i:
            print("%5d" % j,end="")
        print()
    print()
    
# losujemy stopień macierzy

n = random.randrange(2,9)

# tworzymy macierz A

A = []
for i in range(n):
    a = []
    for j in range(n):
        a.append(random.randrange(-99,100))
    A.append(a)

# wyświetlamy macierz A

print("n =",n)
print()
mprint("Macierz A:",A)

# transponujemy macierz A

for i in range(n):
    for j in range(i+1,n):
        A[i][j],A[j][i] = A[j][i],A[i][j]

# wyświetlamy macierz A

mprint("Macierz A^T",A)

# zwalniamy pamięć zajętą przez macierze

del A,a
Wynik:
n = 5

Macierz A:
  -35   24   25  -72   27
    0   90  -65   82  -73
   67  -30  -27  -60  -63
  -34   12  -40   16  -97
   78   67  -78  -65  -70

Macierz A^T
  -35    0   67  -34   78
   24   90  -30   12   67
   25  -65  -27  -40  -78
  -72   82  -60   16  -65
   27  -73  -63  -97  -70

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
©2024 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.