Почему Breeze использует Array для представления матрицы?

Класс DenseMatrix имеет данные параметров типа Array[V]. Почему бы не использовать какую-то другую изменчивую коллекцию, которая может динамически расти, например Vector?

1 ответ

Комментарии (от Рафаэля Рота и Джаспера-М) дают хорошие результаты и являются одной из причин. Breeze использует netlib-java для обработки своего интерфейса с собственным BLAS через JNI и использует массивы. (Он мог бы быть реализован в терминах Java Buffers, но они этого не сделали.) Динамическое изменение размеров DenseMatrices не имеет большого смысла, и реализации DM и DV намеренно похожи.

Массивы также обладают лучшими характеристиками производительности, чем любая другая встроенная в коллекцию вещь в Java и в Scala, и, поскольку Breeze заботится о скорости, это лучший выбор. Все общие коллекции в элементах scala и java box примитивов, что совершенно неприемлемо в средах, чувствительных к производительности. (Я мог бы свернуть свой собственный ArrayBuffer-подобный объект, используя специализированный Scala, но я этого не сделал.) Кроме того, java Vector синхронизирует все обращения, и поэтому это особенно неприемлемо, если вам действительно не нужна блокировка.

Вы можете использовать VectorBuilder (который имеет настраиваемый параметр длины и может быть установлен на -1, чтобы отключить проверку границ), если вы не уверены в размерности вашего набора данных.

Другие вопросы по тегам