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.
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 = [[random.randrange(-99, 100) for j in range(n)] \
for i in range(n)]
# 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 macierz
a = None
|
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
|