Есть ли более быстрый способ создания такого рода матрицы в R?

#r #for-loop #matrix

Вопрос:

Есть более быстрый способ создания матрицы, подобной приведенной ниже, которую я создал, не только для n =4, но и для n=10000. Каждая строка i увеличивается i/i 1

 m=matrix(c(0),n,n);m
m[1,1]=m[1,2]=1/2
m[2,1]=m[2,2]=m[2,3]=1/3
m[3,1]=m[3,2]=m[3,3]=m[3,4]=1/4
m
 

Я попробовал эту lower.tri() функцию, но она не удерживает верхнюю линию вне диагонали

 n=5
m=matrix(c(1/2,1/3,1/4,1/5,1/6),n,n);m
lower.tri(m,diag=FALSE)
m[upper.tri(m,diag=FALSE)]=0
m
MASS::fractions(m)

 

Ответ №1:

Следующие работы:

 m = matrix(1 / (seq(n)   1), n, n)
m[row(m)   1L < col(m)] = 0
 

Ибо n = 4 в результате получается:

           [,1]      [,2]      [,3] [,4]
[1,] 0.5000000 0.5000000 0.0000000 0.00
[2,] 0.3333333 0.3333333 0.3333333 0.00
[3,] 0.2500000 0.2500000 0.2500000 0.25
[4,] 0.2000000 0.2000000 0.2000000 0.20
 

… Из вашего описания я не уверен, намеревались ли вы, чтобы в последней строке было все 0 или все 1 / (n 1), но заполнение ее 0-мя тривиально.

Комментарии:

1. Последняя строка должна быть 1/(n 1)