Когда вы заполняете матрицы из векторов, нужно знать две полезные вещи:
- Заполняет их по столбцам; и
- Если вектор короче части матрицы, которую нужно заполнить, вектор будет переработан (повторен).
Далее, в вашем коде вы используете два for
циклы, вложенные, с очевидным намерением работать только с этими индексами в матрице ... но тогда вы не будете ссылаться на i
и j
в подмножестве или назначении матрицы, поэтому каждый раз, когда он пытается заменить одно значение, это замена всей верхней матрицы три на весь вектор.
Вот более быстрый способ:
mat <- matrix(0, nrow = 5, ncol = 5)
v <- c(2, 4, 5)
mat[upper.tri(mat)][seq_along(v)] <- v
mat
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 2 4 0 0
# [2,] 0 0 5 0 0
# [3,] 0 0 0 0 0
# [4,] 0 0 0 0 0
# [5,] 0 0 0 0 0
Первое индексирование на mat
- это верхний треугольник, так как знаешь. Второе подмножество равно length(v)
из этого подмножества.
Если вы хотите заменить его в произвольных местах в верхнем треугольнике, то вот пример:
mat <- matrix(0, nrow = 5, ncol = 5)
ut <- upper.tri(mat)
fullv <- integer(sum(ut)) # the size of the matrix subset
fullv
# [1] 0 0 0 0 0 0 0 0 0 0
fullv[5 + seq_along(v)] <- v
fullv
# [1] 0 0 0 0 0 2 4 5 0 0
mat[ut] <- fullv
mat
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 0 0 0 4
# [2,] 0 0 0 0 5
# [3,] 0 0 0 2 0
# [4,] 0 0 0 0 0
# [5,] 0 0 0 0 0
Здесь мы продемонстрируйте, что заполнение выполняется по столбцу , а это не то, что вы просили. Чтобы лучше понять, как происходит это заполнение,
mat <- matrix(0, nrow = 5, ncol = 5)
ut <- upper.tri(mat)
mat[ut] <- seq_len(sum(ut))
mat
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 1 2 4 7
# [2,] 0 0 3 5 8
# [3,] 0 0 0 6 9
# [4,] 0 0 0 0 10
# [5,] 0 0 0 0 0
Итак, если вы хотите, чтобы ваши v
находились в очень специфических c местах, и они не являются последовательными для этого заказа, вам нужно будет указать c:
mat <- matrix(0, nrow = 5, ncol = 5)
ut <- upper.tri(mat)
mat[ut][c(6,9,10)] <- v
mat
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 0 0 0 0
# [2,] 0 0 0 0 0
# [3,] 0 0 0 2 4
# [4,] 0 0 0 0 5
# [5,] 0 0 0 0 0