17

我试图创建一个有390行和2340列的对角线矩阵,但在对角线中,我需要一个向量1,代表(1.6).

例如,这些应该是前两行:

1111110.............................00000001111110.......................0

我该怎么做?

4个答案4

重置为默认值
20

以下是一些基本的R选项

  • 使用克罗内克
t(克罗内克(诊断(390),代表(1,6))
  • 使用外面的
+外部(1:390,代表(1:390,each=6),`==`)
  • 使用[<-
`[<-`(矩阵(0,nrow=390,ncol=390*6),cbind(rep(1:390,每个=6),seq_len(390*6)),1)

标杆管理

fkron<-function(){t(克罗内克(诊断(390),代表(1,6))}fouter<-function(){+外部(1:390,重复(1:390,每个=6),`===`)}fassign<-function(){`[<-`(矩阵(0,nrow=390,ncol=390*6),cbind(rep(1:390,每个=6),seq_len(390*6)),1)}微基准(fkron=fkron(),fouter=fouter(),fassign=fassign(),单位=“相对”,check=“相等”)

显示

单位:相对expr最小lq平均中值uq最大neval弗克伦16.315960 6.027245 4.896574 6.471678 4.177969 10.87032 100福特尔9.802039 3.907079 3.381873 3.964311 2.789494 11.18444 100fassign 1.000000 1.0000001.0000001.01000001.0000001.00000 100公司
14

根据矩阵的使用方式,稀疏矩阵可能是更好的选择:

库(矩阵)x<-稀疏矩阵(rep(1:390,每个=6),1:2340)

检查

x[1:3,1:18]#左上角#>“ngCMatrix”类的3 x 18稀疏矩阵#>                                         #>[1,]| | | | | | |。#> [2,] . . . . . . | | | | | | . . . . . .#> [3,] . . . . . . . . . . . . | | | | | |x[388:390,2323:2340]#右下角#>“ngCMatrix”类的3 x 18稀疏矩阵#>                                         #> [1,] | | | | | | . . . . . . . . . . . .#> [2,] . . . . . . | | | | | | . . . . . .#> [3,] . . . . . . . . . . . . | | | | | |

与稠密相比矩阵对象,稀疏矩阵使用的内存少180倍,构建速度更快,在许多情况下会加快操作。演示:

m<-矩阵(rep(1:0,c(6,2340)),390,2340,1)物体尺寸(m)#>3650616字节对象大小(x)#>20064字节微基准::微基准(致密=基质(rep(1:0,c(6,2340)),390,2340,1),稀疏=稀疏矩阵(rep(1:390,每个=6),1:2340))#>单位:微秒#>expr最小lq平均中值uq最大neval#>密度2176.6 2331.3 3025.947 2510.55 2692.2 12528.5 100#>稀疏344.3 374.9 546.522 440.85 493.3 10121.5 100y<-矩阵(runif(390*2340),390,2340)微基准::微基准(密度=交叉触头(m,y),稀疏=矩阵(交叉prod(x,y)),check=“相等”,倍数=10,单位=“相对”)#>单位:相对#>expr最小lq平均中值uq最大neval#>密实121.5391 111.6669 77.11411 82.2131 60.29327 51.23242 10#>稀疏1.0000 1.0000 1.00000 1.00000 1.0000 1.000000 1.00000 10
1
  • 2
    我直接去了.bdiag文件但这要好得多 评论 5月20日14:54
12

逐行思考,您需要六个一,然后是2340个零(其中六个溢出到下一行,将一的序列移动六列),反复重复。因此,您可以通过以下方式实现:

矩阵(c(rep(1,6),rep(02340)),ncol=2340,nrow=390,byrow=TRUE)

请注意,将出现一条警告,说明数据不是行数的倍数,但这是意料之中的:最后一行的零将分配给第391行,但我们说我们只需要390行,因此数据将被截断。

您可以通过以下方式验证结果:

x[1:20,1:20]#左上角x[371:390,2321:2340]#右下角
0
7

你可以试试这个功能。

>fn<-\(透镜1,m){+t(多汁(0:(m-1),\(i)+c(rep_len(0,len_1*i),+rep_len(1,len_1),+rep_len(0,len_1*(m-i-1)))+ }> >fn(1,3)[,1] [,2] [,3][1,]    1    0    0[2,]    0    1    0[3,]    0    0    1>fn(2,4)[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8][1,]    1    1    0    0    0    0    0    0[2,]    0    0    1    1    0    0    0    0[3,]    0    0    0    0    1    1    0    0[4,]    0    0    0    0    0    0    1    1>fn(3,2)[,1] [,2] [,3] [,4] [,5] [,6][1,]    1    1    1    0    0    0[2,]    0    0    0    1    1    1

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.