Transponowanie macierzy


Tematy pokrewne   Podrozdziały
Macierze
Podstawowe pojęcia dotyczące macierzy
Reprezentacja macierzy w pamięci komputera
Mnożenie macierzy przez skalar
Dodawanie macierzy
Transponowanie macierzy
Mnożenie macierzy
Potęgowanie macierzy
Eliminacja Gaussa
Eliminacja Gaussa-Crouta
Wyznacznik macierzy
Rozkład LU
Rozkład LU – rozwiązywanie układu równań liniowych
Rozkład LU – macierz odwrotna
Rozkład LU – wyznacznik macierzy
  Transponowanie macierzy prostokątnej
Transponowanie macierzy kwadratowej

Transponowanie macierzy prostokątnej

Problem

Transponować macierz Am × n na ATn × m.

 

 

 

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 = AT

Elementy pomocnicze:
iw  –  indeks wierszowy macierzy, iw N
ik  – indeks kolumnowy macierzy, ik N
Lista kroków:
K01: Dla iw = 1,2,...,m wykonuj K02...K03
K02:     Dla ik = 1,2,...,n wykonuj K03
K03:         B[ik,iw] ← A[iw,ik]
K04: Zakończ

 

Program

Ważne:

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.

 

Lazarus
// Transponowanie macierzy
// Data: 11.01.2010
// (C)2012 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.
Code::Blocks
// Transponowanie macierzy
// Data: 11.01.2010
// (C)2012 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;
}
Free Basic
' Transponowanie macierzy
' Data: 11.01.2010
' (C)2012 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)2012 mgr Jerzy Wałaszek


 

.

 

Transponowanie macierzy kwadratowej

Problem

Transponować macierz kwadratową An × n w miejscu.

 

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 = AT

Elementy pomocnicze:
i,j  –  indeksy, i,j N
t  – tymczasowe miejsce przechowywania elementu macierzy, t R
Lista kroków:
K01: Dla i = 1,2,...,n - 1 wykonuj K02...K05
K02:     Dla j = i + 1,i + 2,...,n wykonuj K03...K05
K03:         tA[i,j]
K04:         A[i,j] ← A[j,i]
K05:         A[j,i] ← t
K06: Zakończ

 

Program

Ważne:

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 i transponowana. Na koniec program wyświetla ponownie zawartość macierzy A.

 

Lazarus
// Transponowanie macierzy kwadratowej
// Data: 11.01.2010
// (C)2012 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.
Code::Blocks
// Transponowanie macierzy kwadratowej
// Data: 11.01.2010
// (C)2012 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;
}
Free Basic
' Transponowanie macierzy kwadratowej
' Data: 11.01.2010
' (C)2012 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)2012 mgr Jerzy Wałaszek


 

.

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.