как разработать независимую реализацию класса Java-матрицы - PullRequest
1 голос
/ 31 мая 2011

Мне нужно использовать матричный класс в моем приложении для таких операций, как разложение по собственным значениям, LUDecomposition, а также обычные операции с матрицами, такие как умножение, сложение, транспонирование и т. Д. Я решил использовать jama в настоящее время, так как я достаточно хорошо знаком с ним и потому чтоВ настоящее время я работаю с небольшими наборами данных.

Но, возможно, позже я захочу перейти к более качественной матричной библиотеке, такой как ejml или какому-нибудь будущему изобретению, по мере роста объема данных.Как мне спроектировать свой класс матрицы, чтобы он не был привязан к конкретной реализации?Я хотел бы интерфейс, подобный приведенному ниже.

class MyMatrix{

    public MyMatrix addWithAnother(MyMatrix b){
    ...
    }

    public MyMatrix multiplyWithAnother(MyMatrix b){
    ...
    }
    public double[][] getData(){
    ..
    }

    public SomeEigenDecomposition getEigenValueDecomposition(){
    ...
    }

Должен ли я поместить класс матрицы реализации (jama Matrix или тому подобное) в качестве поля и делегировать вызовы к нему?Тем не менее, это связывало бы меня с Джамой, я думаю.

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

спасибо

знак

Ответы [ 3 ]

3 голосов
/ 31 мая 2011

Поскольку не существует де-факто или формального стандартного интерфейса для различных реализаций матрицы Java, вы можете рассмотреть возможность минимизации усилий при переключении реализаций, разработав Фасад , который реализует эту матрицу. хотите, в сочетании с фабрикой матриц (например, Абстрактная фабрика , фабричный метод ), которая создает фактическую матрицу, которую вы хотите использовать под крышками.

Тогда вам нужно будет только реализовать код Adapter , вызывающий базовую реализацию матрицы и внешне соответствующий интерфейсу Facade , для каждой новой реализации, которую вы хотите интегрировать.

Не идеально, но так как реализации имеют различные интерфейсы, вы должны вклеить их в свой код как-то . По крайней мере, этот подход защищает ваш клиентский / тестовый код от изменений под Facade .

2 голосов
/ 31 мая 2011

Определите, что у вас есть (или аналогично, если необходимо) как интерфейс.

Создайте класс, который реализует этот интерфейс, который напрямую использует библиотеку Jama или что-то еще.Открытые члены интерфейса доступны только для общего доступа.

Вызовите ваш класс через интерфейс.Если вы хотите использовать другую реализацию, создайте другой класс, который реализует тот же интерфейс, но который делает вещи по-разному внутри;вы сможете поместить его туда, где вы использовали предыдущую реализацию, потому что интерфейс точно такой же.

0 голосов
/ 09 сентября 2015

Больше длинного комментария, чем ответа:

Ваша самая большая проблема переключения, вероятно, будет связана с использованием основного хранилища номеров.Jama использует двойные массивы, что очень важно для производительности, но разные пакеты, вероятно, будут обрабатывать представление чисел по-разному.Различия в представлении типов данных, таких как мнимые числа, математические вычисления произвольной точности, рациональные значения или внутреннее представление, которое не разрешает иррациональные числа до более позднего времени, могут быть действительно трудными для планирования.

Я люблю Java, но Java - это паршивонесмотря на это, потому что у него нет пригодного для использования базового класса для чисел (я разобрался с этим, написав свою собственную матричную библиотеку, чтобы помочь мне изучить математику).Синтаксис Java для работы с математикой также неудобен.(В итоге я создал все классы на Java, но использовал их из Groovy, что позволило значительно улучшить математический синтаксис.)

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

...