2015-03-24 3 views
2

Я знаю, как я могу сделать массив из N чисел р * р матриц:Как сделать массив диагональных матриц в R?

m=array(x, c(p,p,N)) 

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

+0

Пожалуйста, поделитесь, что вы пробовали и то, что «не работают». – peterchen

+0

Используйте 'matrix' и сделайте число строк и столбцов равным. См. Https://stat.ethz.ch/R-manual/R-devel/library/base/html/matrix.html – User7598

+0

'replicate (2, diag (3))' – user20650

ответ

2

Если вы не возражаете, используя пакет, вы можете использовать abind:

library(abind) 
do.call(abind, c(rep(list(diag(3)), 2), along = 3)) 
#, , 1 
# 
#  [,1] [,2] [,3] 
#[1,] 1 0 0 
#[2,] 0 1 0 
#[3,] 0 0 1 
# 
#, , 2 
# 
#  [,1] [,2] [,3] 
#[1,] 1 0 0 
#[2,] 0 1 0 
#[3,] 0 0 1 
+0

Хорошая библиотека, не знала! –

+0

@ColonelBeauvel Это не так эффективно, как ваш ответ, но не нужно слишком сильно мучить мозг. – Roland

+0

Спасибо @ Роланд. Я не знал об этой библиотеке. :) – Le1887

4

Это немного неуклюжим, но вы можете сделать это:

n = 3 
num_of_matrix = 2 

array(rep(c(diag(n)),num_of_matrix),c(n,n,num_of_matrix)) 
#, , 1 

#  [,1] [,2] [,3] 
#[1,] 1 0 0 
#[2,] 0 1 0 
#[3,] 0 0 1 

#, , 2 

#  [,1] [,2] [,3] 
#[1,] 1 0 0 
#[2,] 0 1 0 
#[3,] 0 0 1 
+0

Используя неявную переработку R при заполнении массивов, чище просто делать массив (diag (n), c (n, n, num_of_matrix)) ' –

+0

True! Я предпочел упомянуть все, чтобы быть более ясным, но мой способ разрезать был 'array (c (diag (n)), c (n, n, num_of_matrix))', ваш намного лучше :)! –

+0

Спасибо @ColonelBeauvel. Он работает – Le1887

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