r создание диагональной матрицы из вектора с использованием функции upper.tri - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть вектор

vector= c(4,6,2,9)

Мне нужно получить диагональную матрицу, похожую на эту (второй столбец должен содержать вектор, прокручиваемый вниз на один элемент, третий - на два элемента и т. Д.):

4 0 0 0
6 4 0 0
2 6 4 0
9 2 6 4

Как я мог понять, я должен использовать upper.tri.

Я попробовал это:

vector = c(4,6,2,9)
vector_length=length(a)
MATRIX= matrix(0, vector_length, vector_length)
MATRIX[!upper.tri(MATRIX)]=vector 
MATRIX

и потерпел неудачу, потому что результат был

       [,1] [,2] [,3] [,4]
[1,]    4    0    0    0
[2,]    6    4    0    0
[3,]    2    6    9    0
[4,]    9    2    4    6

Как правильно использовать эту функцию?И как мне решить мою проблему?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вот один из способов:

MATRIX = matrix(c(vector, 0), vector_length, vector_length)
# ignore warning about uneven recycling
MATRIX[upper.tri(MATRIX)] = 0
#      [,1] [,2] [,3] [,4]
# [1,]    4    0    0    0
# [2,]    6    4    0    0
# [3,]    2    6    4    0
# [4,]    9    2    6    4
1 голос
/ 03 апреля 2019

Один из вариантов - использовать тот факт, что data.table::shift векторизовано в аргументе n

do.call(cbind, data.table::shift(vector, seq(vector_length) - 1, fill = 0))
#      [,1] [,2] [,3] [,4]
# [1,]    4    0    0    0
# [2,]    6    4    0    0
# [3,]    2    6    4    0
# [4,]    9    2    6    4

или используя row() и col() в базе R

m <- matrix(0, vector_length, vector_length)
diagn <- row(m) - col(m) + 1
m[diagn > 0] <- vector[diagn[diagn > 0]]

m
#      [,1] [,2] [,3] [,4]
# [1,]    4    0    0    0
# [2,]    6    4    0    0
# [3,]    2    6    4    0
# [4,]    9    2    6    4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...