|
Serwis Edukacyjny w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
ProblemNależy transponować
|
Operacja transponowania macierzy polega na zamianie wierszy w kolumny i kolumn w wiersze. Operację transponowania oznaczamy
Przykład:
|
|
= |
|
3×4 | ||||||||||
| 4×3 |
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
|
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
|
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. |
// 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 = [[random.randrange(-99, 100) for j in range(n)] \
for i in range(m)]
arr = [0] * m
b = []
for i in range(n):
b.append(arr.copy())
# 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
a = None
b = None
|
| 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 |
ProblemNależy transponować macierz kwadratową
|
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:
|
→ |
|
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:
|
→ |
|
W efekcie dwa pierwsze wiersze i dwie pierwsze kolumny macierzy są gotowe. Operację kontynuujemy z pozostałą częścią macierzy:
|
→ |
|
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.
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
|
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 |
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. |
// 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
|
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.