skip to navigation
skip to content

feed icon RSS хранилка

Матрици

Публикувано на 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.