Ограниченные матрицы в Ruby

Почему у класса Matrix нет методов для редактирования его векторов и компонентов? Кажется, что все внутри матрицы может быть прочитано, но не записано. Я ошибаюсь? Есть ли какой-нибудь сторонний элегантный Matrix-подобный класс, который позволил бы мне удалять строки и намеренно редактировать их?

Пожалуйста, сообщите мне, если такого класса нет — я прекращаю поиск.


person gmile    schedule 28.09.2009    source источник
comment
Можете ли вы объяснить, что вы делаете с ним?   -  person khelll    schedule 28.09.2009
comment
Я ищу «плохие» строки и столбцы (которые полностью состоят из нулей), а затем хочу их удалить. У меня уже есть код для этого, но он полностью написан с помощью массивов. Тем не менее, я пытаюсь найти более точное и красивое решение.   -  person gmile    schedule 28.09.2009


Ответы (1)


Разработчик класса Matrix, должно быть, был поклонником неизменяемых структур данных и функционального программирования. Да вы правы.

В любом случае, есть простое решение для того, что вы хотите. Используйте Matrix для того, что он может сделать, затем просто используйте .to_a, чтобы получить настоящий массив.

>> Matrix.identity(2).to_a
=> [[1, 0], [0, 1]]

См. также Числовой Ruby Narray. Вы также можете изменить класс, чтобы добавить больше поведения. Если вы это сделаете, исправьте подкласс Matrix. (Есть проекты библиотек Ruby, которые хотят большего поведения от классов required, поэтому они напрямую изменяют их, делая свои новые файлы несколько токсичными. Они могли бы так легко просто исправить подкласс или класс-одиночку.)

О, и khellll (:-), вероятно, хотел бы, чтобы я сказал, что вполне возможно, что вы можете сделать то, что вам нужен в функциональном стиле. То есть путем создания новых объектов, а не путем изменения старых.

person DigitalRoss    schedule 28.09.2009
comment
+1 за упоминание неизменности и функционального программирования, поэтому я спросил, что именно вы хотите сделать, потому что должен быть способ, но без изменения текущей матрицы. - person khelll; 28.09.2009