Transpozycja i mnożenie macierzy

Zadanie 12 z 14 · rozdział 13Trudność: 2 z 3macierzepętle zagnieżdżonealgebra

Treść zadania

Wczytaj macierz A o wymiarach n×m i macierz B o wymiarach r×p.

a) Wypisz macierz transponowaną $A^T$ o wymiarach m×n: jej wiersz j to kolumna j macierzy A, czyli $A^T_{ji} = A_{ij}$.

b) Wypisz iloczyn $A \cdot B$ o wymiarach n×p, w którym $(A \cdot B)_{ij} = \sum_{k} A_{ik} \cdot B_{kj}$ — element w wierszu i i kolumnie j to suma iloczynów kolejnych elementów wiersza i macierzy A i kolumny j macierzy B. Iloczyn istnieje tylko wtedy, gdy liczba kolumn A jest równa liczbie wierszy B ($m = r$); w przeciwnym razie zamiast iloczynu wypisz Niezgodne wymiary.

Dane wejściowe

  • 1. linia: n m — wymiary macierzy A
  • następnie n linii po m liczb całkowitych
  • następnie linia r p — wymiary macierzy B
  • następnie r linii po p liczb całkowitych

Dane wyjściowe

Najpierw m linii macierzy $A^T$, zaraz po nich n linii iloczynu $A \cdot B$ albo jedna linia Niezgodne wymiary. (bez pustych linii między częściami).

Ograniczenia

  • 1 ≤ n, m, r, p ≤ 10
  • elementy macierzy mają wartość bezwzględną nie większą niż 100

Uwagi

  • Mnożenie macierzy wymaga trzech zagnieżdżonych pętli: po wierszach A, po kolumnach B i po sumowanych elementach.
  • Mnożenie macierzy nie jest przemienne — $A \cdot B$ zwykle różni się od $B \cdot A$, a jeden z tych iloczynów może w ogóle nie istnieć.

Przykład

Wejście
2 3
1 2 3
4 5 6
3 2
7 8
9 10
11 12
Wyjście
1 4
2 5
3 6
58 64
139 154

Na przykład $58 = 1 \cdot 7 + 2 \cdot 9 + 3 \cdot 11$ (pierwszy wiersz A i pierwsza kolumna B).

Zasady obowiązujące w rozdziale 13

Zadania w tym rozdziale ćwiczą pracę z listami dwuwymiarowymi (macierzami): tworzenie, wczytywanie, przechodzenie po wierszach i kolumnach oraz przekształcanie.
Każde zadanie (oraz każdy podpunkt) jest osobnym, niezależnym programem: czyta standardowe wejście (stdin) i wypisuje wynik na standardowe wyjście (stdout).

Konwencje wspólne:

  • Dane wczytuj dokładnie w kolejności podanej w sekcji Wejście.
  • Wiersz macierzy na wejściu to jedna linia z liczbami oddzielonymi spacjami — wczytaj całą linię i rozbij ją po spacjach (input().split()).
  • W wyjściu macierzy: każdy wiersz w osobnej linii, elementy oddzielone pojedynczą spacją.
  • Program nie wypisuje komunikatów typu „Podaj liczbę:”.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
1 1
5
1 1
-3
Oczekiwane wyjście
5
-15

Test 2

Nie uruchomiono
Wejście
1 3
1 2 3
3 1
4
5
6
Oczekiwane wyjście
1
2
3
32

Test 3

Nie uruchomiono
Wejście
3 1
1
2
3
1 3
4 5 6
Oczekiwane wyjście
1 2 3
4 5 6
8 10 12
12 15 18

Test 4

Nie uruchomiono
Wejście
2 2
1 2
3 4
3 2
1 0
0 1
1 1
Oczekiwane wyjście
1 3
2 4
Niezgodne wymiary.

Test 5

Nie uruchomiono
Wejście
2 2
2 -1
0 3
2 2
1 0
0 1
Oczekiwane wyjście
2 0
-1 3
2 -1
0 3

Test 6

Nie uruchomiono
Wejście
2 3
1 0 2
-1 3 1
3 2
3 1
2 1
1 0
Oczekiwane wyjście
1 -1
0 3
2 1
5 1
4 2

Test 7

Nie uruchomiono
Wejście
1 2
1 1
1 2
5 5
Oczekiwane wyjście
1
1
Niezgodne wymiary.
Uruchom z własnymi danymi