Вопрос

Что является хорошим представлением матриц в Clojure?Мне интересно иметь дело с плотными матрицами чисел с плавающей запятой.На ум приходит представление "списка списков", но есть ли что-то лучше?

Некоторые критерии хорошей представленности включают:

  • Эффективность:Они не будут использоваться для постоянной обработки огромных наборов данных, но я не хочу тратить часы на вычисление результатов, которые при лучшем дизайне можно было бы получить за считанные минуты.
  • Совместимость с Java:Было бы неплохо легко передавать данные туда и обратно между двумя языками.
  • Простое Распараллеливание:Если я смогу использовать все доступные ядра, просто заменив map с pmap, - это было бы неплохо.
  • Поддается использованию reduce:Похоже, что многие вычисления, которые я выполняю, работают очень хорошо reduce.
  • Возможность представления строк сканирования изображения в строках матрицы:На самом деле это не очень важно, но было бы неплохо иметь.

Есть какие-нибудь мысли?

Это было полезно?

Решение

Инкантер предоставляет обертку вокруг некоторых Параллельный Кольт, включая то, что выглядит довольно приличной реализацией быстрых, распараллеленных плотных матриц, которые взаимодействуют с библиотеками Clojure на основе seq.Я не использовал его, но это должно быть то, что вы ищете.

Пример.

Другие советы

Я пишу оболочку матричной библиотеки jblas предположительно, Клатрикс.В нем отсутствует множество функций, которые я все еще хочу добавить, но в нем есть большая часть того, что вы, возможно, ищете.Взглянем, http://github.com/tel/clatrix.

Ознакомьтесь с предложением core.matrix + экспериментальной реализацией здесь:

https://github.com/mikera/matrix-api

На момент написания статьи это было очень рано, но за этим стоит следить.

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

Clojure от Rich Hickey - это Лисп на основе JVM, который представляет PersistentVector (не PersistentList) с 32-сторонним деревом.

Если вы хотели бы написать свой собственный матричный тип, я бы использовал PersistentVector в противном случае лучшим выбором будет использование Parallel Colt с Incanter.

Недавно я написал код, требующий матричной математики, и первоначально я использовал вектор-векторов, карту и сокращение, но обнаружил, что полученный код трудно понять, когда я вернулся к нему (я новичок в Clojure).Incanter сделал тот же код очень кратким, простым для понимания (стандартные матричные операции) и намного быстрее.

ответы, возможно, потребуется обновить по прошествии 8 лет.Быстрый поиск в Google показывает, что если вам нужна совместимость с Clojure core.matrix API, вы можете использовать сам core.matrix или другие реализации, такие как Vectorz-clj.

Кроме того, я нашел неандерталец который оптимизирован для графического процессора

Я не эксперт, но все равно вот мое мнение :)

Список списков, вероятно, является наиболее естественной идиомой Clojure для представления матриц.Эта структура также хорошо подходит для отображения/сокращения типов операций.Clojure также довольно эффективен при обработке последовательностей — возможно, лучше, чем большинство альтернатив.

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

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

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

Как бывший программист на языке C, я вкратце подумал, что вы можете реализовать свою матрицу как одномерную структуру (т.прямую последовательность или, лучше сказать, вектор) и выполните собственные вычисления индекса, чтобы найти правильный элемент.Вы можете использовать раздел функция, позволяющая пройти через него...ну, это можно было бы заставить работать, но я подозреваю, что есть очень веские причины не делать этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top