2015-04-13 7 views
3

Я много работаю с собственными значениями и, следовательно, строением/разустройством диагональных матриц - это то, что я делаю много. В духе Дж, я придумал некоторые простые определения, но задаюсь вопросом, пропустил ли я более простой способ? Я не мог найти ничего в разговорнике, но, возможно, искал не то место.Диагональные матрицы в J

сделать диагональную матрицу из списка диагональных элементов:

diag =: * [email protected]@# 

Извлечение диагональными из матрицы:

extract =: +/@(* [email protected]@#) 
+0

Есть соответствующие определения в 'math/mt' и' math/lapack' – Eelvex

+0

Теперь я знаю, где искать! – user1202733

ответ

4

диагональные элементы матрицы имеют определение Standar в J:

extract =: (<0 1)&|: 

Это, к сожалению, скрыто где-то в словаре. (Вы можете увидеть его прохождение в transpose)

Я обычно не используют в качестве DIAG

diag =: 3 :'(2##y) $ ,_1 (((#y)#0),~])\y' 

, но я уже не помню, почему. Ваша версия лучше.

1
(* =) 2 3 4 
2 0 0 
0 3 0 
0 0 4 

Если вы работаете с уникальными элементами.

diag=: * = NB. a hook defined tacitly 

    diag 89 3 56.6 
89 0 0 
0 3 0 
0 0 56.6 

В = рассыпается, если элементы не являются уникальными, поскольку матрица уже не квадратные

diag 3 4 4 
|length error: diag 
|  diag 3 4 4 
1

Другое решение заключается в использовании «копировать-заливку».

diag =: (2 ##) $ (#~ 1 j. #) 

Это больше, чем первоначальная формулировка ФП, но он работает для обоих чисел и символов (до тех пор, как вы хотите пространства, чтобы играть роль нуля).

Краткое объяснение (в первую очередь для "будущего со мной", так как я довольно новыми для J):

Рассмотрим следующий пример (с y =: 1 2 5 7 представляющие диагональные элементы):

4 4 $ 1j4 # y NB. the required diagonal matrix 

комплекс номер аргумента 1j4 слева от # вставляет 4 нуля после каждого скопированного элемента с y. Преобразование этого в матрицу 4 × 4 дает диагональную матрицу.

4 наверху есть только количество товаров в y: #y. Поэтому мы можем обобщить как (2 # #y) $ (1 j. #y) # y. Непосредственный эквивалент этого дается вверху.

Смежные вопросы