Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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 如何生成矩阵a)每行的单个值为1;B) 行和为一_R_Matrix - Fatal编程技术网

R 如何生成矩阵a)每行的单个值为1;B) 行和为一

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

这是一个由两部分组成的问题:第一部分是创建一个NXN平方矩阵,其中每行中只有一个随机元素为1,其他项必须为零。(即每行元素的总和为1)

第二种方法是创建一个NXN平方矩阵,其中每行中的项目总和为1,但每个元素遵循一个分布,例如正态分布

相关问题包括() Matlab似乎可以自动地做我想要做的事情(),但我正在r中寻找解决方案

以下是我尝试过的:

# 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