R 如何生成矩阵a)每行的单个值为1;B) 行和为一
这是一个由两部分组成的问题:第一部分是创建一个NXN平方矩阵,其中每行中只有一个随机元素为1,其他项必须为零。(即每行元素的总和为1) 第二种方法是创建一个NXN平方矩阵,其中每行中的项目总和为1,但每个元素遵循一个分布,例如正态分布 相关问题包括() Matlab似乎可以自动地做我想要做的事情(),但我正在r中寻找解决方案 以下是我尝试过的:R 如何生成矩阵a)每行的单个值为1;B) 行和为一,r,matrix,R,Matrix,这是一个由两部分组成的问题:第一部分是创建一个NXN平方矩阵,其中每行中只有一个随机元素为1,其他项必须为零。(即每行元素的总和为1) 第二种方法是创建一个NXN平方矩阵,其中每行中的项目总和为1,但每个元素遵循一个分布,例如正态分布 相关问题包括() Matlab似乎可以自动地做我想要做的事情(),但我正在r中寻找解决方案 以下是我尝试过的: # PART 1 N <- 50 x <- matrix(0,N,N) lapply(1:N, function(y){ x[y,samp
# PART 1
N <- 50
x <- matrix(0,N,N)
lapply(1:N, function(y){
x[y,sample(N,1)]<- 1
})
#第1部分
N这里您可以看到为什么lappy
并不总是替换循环。您试图遍历x
的行并修改矩阵,但您所修改的是来自全局环境的x
的副本
最简单的修复方法是使用for
循环:
for (y in 1:N) {
x[y,sample(N,1)]<- 1
}
但是,这更具可读性:
matrix(rnorm(N*N), N, N)
现在将其缩放为行和等于1。您使用的事实是矩阵是面向列的,并且向量是循环的,这意味着您可以将矩阵M
除以行和(M)
。使用更合理的N=5
:
m <- matrix(rnorm(N*N), N, N)
m/rowSums(m)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.1788692 0.5398464 0.24980924 -0.01282655 0.04430168
## [2,] 0.4176512 0.2564463 0.11553143 0.35432975 -0.14395871
## [3,] 0.3480568 0.7634421 -0.38433940 0.34175983 -0.06891932
## [4,] 1.1807180 -0.0192272 0.16500179 -0.31201400 -0.01447859
## [5,] 1.1601173 -0.1279919 -0.07447043 0.20865963 -0.16631458
mNo-loop解决方案:)
n这是另一个无循环的解决方案,它使用两列寻址功能,使用“[请编辑您的问题,并显示您期望的矩阵和您得到的矩阵。谢谢。问题是您正在修改函数中的x
(函数传递给lappy
)因此,你正在修改一个被丢弃的<代码> x <代码>的副本,所以我会建议它作为注释。对于第1部分,做<代码> x这个技巧起作用(当然,如果<代码>和!= 0 < /代码>),但是分布不同于<代码> n(0,1)< /代码>,请记住,请考虑<代码>矩阵(rFug(n*n),n,n))-RoSoM(m)+1
。或1+t(标度(矩阵(rnorm(N*N,平均值=1),N,N))
。前者对整个矩阵的sd=1。后者对每一行的sd=1。
matrix(rnorm(N*N), N, N)
m <- matrix(rnorm(N*N), N, N)
m/rowSums(m)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.1788692 0.5398464 0.24980924 -0.01282655 0.04430168
## [2,] 0.4176512 0.2564463 0.11553143 0.35432975 -0.14395871
## [3,] 0.3480568 0.7634421 -0.38433940 0.34175983 -0.06891932
## [4,] 1.1807180 -0.0192272 0.16500179 -0.31201400 -0.01447859
## [5,] 1.1601173 -0.1279919 -0.07447043 0.20865963 -0.16631458
n <- 5
# on which column in each row insert 1s
s <- sample(n,n,TRUE)
# indexes for each row
w <- seq(1,n*n,by=n)-1
index <- s+w
# vector of 0s
vec <- integer(n*n)
# put 1s
vec[index] <- 1
# voila :)
matrix(vec,n,byrow = T)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 0 0 0 1 0
[3,] 0 0 0 0 1
[4,] 1 0 0 0 0
[5,] 1 0 0 0 0
M <- matrix(0,N,N)
M[ cbind(1:N, sample(1:N, N, rep=TRUE))] <- 1
> rowSums(M)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1