2016-12-12 2 views
1

このコードを{x.a、x.b、x.c}から{x.a、...、x.n}に拡張したいと思います。ここでnは長さ(名前)として定義されます。名前の動的ベクトル:3からnへの増加

names = c("a", "b" , "c") 
set.seed(123) 
x.nsim = 5000 
x.a = runif(x.nsim, min=-1.5, max=1.5) 
x.b = runif(x.nsim, min=-1.5, max=1.5) 
x.c = 1 - x.a - x.b 

for (i in 1:x.nsim) { 
    z.vec = c(x.a[i], x.b[i], x.c[i]) 
    points(z.vec^3, z.vec, cex=0.1) 
} 

この拡張を実行しようとしました。何かヒント?

a<-NULL 
for (name in names){ 
    #x<-paste("x.",name,"[i]", sep="", collapse="") 
    a<-cbind(a, paste("x.",name,"[i]", sep="", collapse="")) 
    a 
} 
a 
z.vec <- NULL 
for (i in 1:x.nsim){ 
    for (j in 1:length(names)){ 
    z.vec <- cbind(z.vec, a[j]) 
    points(z.vec^3, z.vec, cex=0.1) 
    } 
} 
+1

シーケンシャル名の代わりにデータ構造を使用する必要があります。逐次名を付けようとしているオブジェクトの次元数に応じて、ベクトル、行列、リストを使用します。 – Gregor

+1

「1:length(x.nsim)」の代わりに '1:x.nsim'があるはずです。ちょうど' 1:1'だからです。 –

答えて

0

ここでデータ構造を使用する必要があります。同じ長さとタイプ(および起源)のベクトルがたくさんあるので、ここでは行列を使うのが自然です。 はのは、いくつかの初期パラメータを設定してみましょう:

nsim <- 5000 
n <- 10 

私はあなたが書いたものとは理解しているように、我々は[-1.5, 1.5]上の一様分布から長さ​​の(n-1)ベクトルをサンプリングする必要があります。代わりに、私たちは(n-1)*nsim値をシミュレートし、その後(n-1)列の行列にそれらを置くことによって、より迅速にそれを行うことができ次々ベクトルをシミュレートする:

m <- matrix(runif((n - 1)*nsim, -1.5, 1.5), ncol = n - 1) 

列番号n(私は理解して再びとして)1 - [sum of first (n-1) columns]です。

m <- cbind(m, 1 - rowSums(m)) 

今、あなただけのm[i,]としてあなたz.veciを得ることができます。

+0

@ Iaroslav Dominありがとう、これはクールです。それを解決する他の方法がありますか(教育的に)? – rrg

+0

確かにあります。しかし、私がここで思うことから、すべてが醜く、最適化されていないように見えます。 –

関連する問題