Матрици
Публикувано на 29.05.2008 7:35 от Митьо
Последна промяна на 28.06.2008 13:57
Цел
Да се реализира библиотека, позволяваща извършване на определени операции с матрици.
Подробности
- Реализацията на библиотеката трябва да отговаря на зададения по-долу интерфейс.
- Необходимо е да имате смислени unit-test-ове за създадените класове и функционалност.
- За да се ползва библиотеката, да е необходим единствено следния ред код:
import matrix
. - Операциите в класовете
symmetric_matrix
,diagonal_matrix
,orthogonal_matrix
, които могат да бъдат реализирани по-ефективно, заради свойствата на съответния тип матрица, да бъдат реализирани по-ефективно.
Интерфейс
Класове
class matrix
— представлява каква да е матрица.class symmetric_matrix
— представлява само симетрични матрици.class diagonal_matrix
— представлява само диагонални матрици.class orthogonal_matrix
— представлява само ортогонални матрици.
Създаване
Описаните начини за създаване на инстанция на матрица важат за всички посочени по-горе класове.
matrix(m, n, *nums)
конструира матрица от m реда и n стълба с числата, подадени като аргументи след m и n. При некоректни входни данни, хвърляValueError
или негов наследник. Това важи за всички методи, за които има смисъл да се хвърли това изключение при безсмислени входни данни. В противен случай, създава нова инстанция от съответния клас. Допуска се създаване на матрица само чрез задаване на m и n, което ще създаде единична матрица със съответната размерност. Минималната размерност е 1х1.
Операции
- Да се реализират операциите събиране и изваждане за кои да е инстанции на класовете матрици, посочени по-горе. Необходимо е размерността на матриците да съвпада. В противен случай, да се хвърли
ValueError
или негов наследник. - Да се реализира операцията умножение за всички инстанции на класовете матрици, посочени по-горе. Необходимото условие е матрицата отляво да има толкова колони, колкото реда има матрицата вдясно на умножението.
- Да се реализира операцията умножение на матрица със скалар (число). Размерността на матрицата не е от значение в случая.
- Сравнение на матрици — две матрици са равни, ако са с еднаква размерност и ако всички техни елементи са равни.
__repr__
да работи както се очаква.__str__
да връща низ с m реда, като на всеки ред има n числа, разделени с"\t"
.m.inverse(), m.inversed()
— в първия случай, променя матрицата на място и връщаself
. Във втория случай, връща нова инстанция с обратна на текущата матрица.m.transpose(), m.transposed()
да спазват същата логика като горните два метода, като изпълняват операцията „транспониране на матрица“.m.determinant()
- връща детерминантата на съответната матрица.m.get(i, j), m.set(i, j, value)
са своеобразни getter и setter на елемента, съответстващ на ред i, стълб j в дадената матрица. При некоректна стойност, се вдигаValueError
или негов наследник. Пример за некоректна стойност е да се опита поставяне на ненулев елемент извън главния диагонал на диагонална матрица (инстанция наdiagonal_matrix()
).
Свойства
Посочените свойства са само за четене.
m.is_symmetric
да бъдеTrue
, ако инстанцията, на която се прилага, е симетрична матрица.m.is_orthogonal
да бъде истина за ортогонални матрици (матрици, чиито обратни са равни на техните транспонирани).m.is_diagonal
е истина за диагонални матрици (имащи ненулеви елементи само по главния диагонал).m.m
да отговаря на броя на редовете на текущата матрица.m.n
да отговаря на броя на стълбовете й.
Сериализация
stream_in(fp)
зарежда матрица от потокаfp
и връща нова нейна инстанция.stream_out(fp, m)
запазва матрица във потокаfp
така, че тя после да може да бъде прочетена отsteram_in()
.
Посoчените методи за сериализация да работят така, че в един файл (поток) да могат да бъдат сериализирани повече от една матрици. stream_in()
да връща нови инстанции на матрици, докато такива могат да се прочетат от съответни поток, да връща None
при достигане края на потока и да хвърлят ValueError
или наследник при безсмислени входни данни. Посочените два метода се реализират като статични методи към съответния клас.
Точки: 50
Бонуси
10 т. за реализация на индексен оператор от типаm[i][j]
, който да връща елемента от матрицатаm
, намиращ се на редi
, стълбj
, както и да позволява промяната му. Тези точки могат да бъдат получени и ако предложите по-оригинален и елегантен метод за достъпване и промяна на елемент от матрицата, намиращ се на ред i, стълб j.