2013-12-18 5 views
2

Я просмотрел core.matrix, ища функцию диагональной матрицы блока и искал Google, но не нашел такой функции. Существует ли такая функция? Если это не помогло мне указать мне правильное направление на такую ​​функцию.Диагональная матрица блока в Clojure

Примеры входов будут вложенными векторами, которые будут выводиться вдоль диагоналей большего вложенного вектора.

Символьный пример: Пусть a, b, c, d - матрицы (вложенные векторы). Пример вывода будет выглядеть

[[a 0 0 0] [0 b 0 0] [0 0 c 0] [0 0 0 d]] 

, где д может быть [[0 1] [1 0]].

+0

вы ищете диагональную матрицу? https://github.com/mikera/vectorz-clj/blob/develop/src/main/clojure/mikera/vectorz/matrix.clj#L109 – edbond

+0

Пока диагональные элементы могут быть матрицами (вложенными векторами). – sunspots

+0

Не могли бы вы представить пример ввода и вывода? – mishadoff

ответ

4

В первую очередь нужна функция для генерации вектора размера п с элементом м вводится в я-й позиции.

(defn vec-i [m i n] 
    (-> (repeat n 0) 
     (vec) 
     (assoc-in [i] m))) 

(vec-i 'a 0 10) => [a 0 0 0 0 0 0 0 0 0] 
(vec-i 'b 2 7) => [0 0 b 0 0 0 0] 

Тогда просто объединить результаты для каждого я (предполагающей matrices являются список ваших диагональных элементов)

(defn block-diag [matrices] 
    (let [n (count matrices)] 
    (vec (map-indexed #(vec-i %2 %1 n) matrices)))) 

(block-diag ['a 'b 'c 'd]) => [[a 0 0 0] [0 b 0 0] [0 0 c 0] [0 0 0 d]] 

Конечно, символы ABCD могут быть заменены на матрицы.

0

Библиотека Vectorz (которая обеспечивает основные типы для vectorz-CLJ) включает в себя BlockDiagonalMatrix класс:

Вы должны будете использовать Java Interop, чтобы создать его экземпляр прямо сейчас, но он предлагает несколько преимуществ:

  • Эффективность памяти - хранится только блок диагональных компонентов
  • Оптимизированные операции - различные векторные операции используют тот факт, что большие площади матрицы гарантированно быть равен нулю для выполнения быстрых вычислений

В долгосрочной перспективе, вероятно, имеет смысл добавить block-diagonal-matrix функцию самой core.matrix , На самом деле, я только что создал проблему, чтобы сделать это: