Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何基于一个m变量生成序列矩阵_R_Matrix - Fatal编程技术网

R 如何基于一个m变量生成序列矩阵

R 如何基于一个m变量生成序列矩阵,r,matrix,R,Matrix,我对带有一个变量m的循环矩阵有问题。如何用for循环求解这个矩阵 [1 1/2 ... 1/(m+1), 1/2 1/3 ... 1/(m+2), ... ... ..., 1/(m+1) 1/(m+2) ... 1/(2m+1)] 我在Matlab上用代码生成它: m = 10; m1 = repmat(1:m+1,1,m+1); m2 = reshape(m1,m+1,m+1); m3 = m2 + m2' - 1; m4 = 1./m3; 如何在R中生成相同的代码?您可以执行以下

我对带有一个变量
m
的循环矩阵
有问题。如何用for循环求解这个矩阵

[1 1/2 ... 1/(m+1), 
1/2 1/3 ... 1/(m+2),
 ... ... ..., 
1/(m+1) 1/(m+2) ... 1/(2m+1)]
我在Matlab上用代码生成它:

m = 10;
m1 = repmat(1:m+1,1,m+1);
m2 = reshape(m1,m+1,m+1);
m3 = m2 + m2' - 1;
m4 = 1./m3;
如何在R中生成相同的代码?

您可以执行以下操作:

m <- 4
a <- matrix(,m+1, m+1)
a <- 1/(col(a)+row(a)-1)
# > a
#           [,1]      [,2]      [,3]      [,4]      [,5]
# [1,] 1.0000000 0.5000000 0.3333333 0.2500000 0.2000000
# [2,] 0.5000000 0.3333333 0.2500000 0.2000000 0.1666667
# [3,] 0.3333333 0.2500000 0.2000000 0.1666667 0.1428571
# [4,] 0.2500000 0.2000000 0.1666667 0.1428571 0.1250000
# [5,] 0.2000000 0.1666667 0.1428571 0.1250000 0.1111111
m您还可以:

1/(matrix(seq_len(m),m,m,byrow=TRUE) + rep(seq_len(m),times=m)-1)

          # [,1]      [,2]      [,3]      [,4]      [,5]
# [1,] 1.0000000 0.5000000 0.3333333 0.2500000 0.2000000
# [2,] 0.5000000 0.3333333 0.2500000 0.2000000 0.1666667
# [3,] 0.3333333 0.2500000 0.2000000 0.1666667 0.1428571
# [4,] 0.2500000 0.2000000 0.1666667 0.1428571 0.1250000
# [5,] 0.2000000 0.1666667 0.1428571 0.1250000 0.1111111

基准测试

library(microbenchmark)
f_jogo1=function(m) {a <- matrix(,m, m);1/(col(a)+row(a)-1)}
f_jogo2=function(m) 1/(outer(1:(m), 1:(m), '+')-1)
f_989=function(m) 1/(matrix(seq_len(m),m,m,byrow=TRUE) + rep(seq_len(m),times=m)-1)

m <- 1000
all(f_jogo1(m)==f_989(m))
# [1] TRUE
all(f_jogo2(m)==f_989(m))
# [1] TRUE
res <- microbenchmark(f_jogo1(m), f_jogo2(m), f_989(m))
1/(m+1)对不起;)<代码>1/(外部(1:(m+1),1:(m+1),“+”)-1)
是一个带有
outer()
1/sapply(1:(m+1),函数(x)x+(0:m))
sapply()
1/(矩阵(0:(m-1),m,byrow=TRUE)+seq_len m)的解决方案。
可能更快。
print(res, order="mean")

# Unit: milliseconds
       # expr       min        lq     mean   median       uq      max neval
   # f_989(m)  8.118373  9.590521 19.40905 10.43484 40.12283 42.63866   100
 # f_jogo2(m)  8.946466  9.783122 22.37673 10.70451 40.57098 42.50735   100
 # f_jogo1(m) 10.151347 11.758405 27.85950 41.25485 42.30168 44.51509   100