2016-09-19 7 views
0

アルゴリズムの例をいくつか変更します。 最後の例では情報がありませんでした。私はもっ​​と詳しく説明しています。おそらく、いくつかの基本的な問題がありますが、私はループに慣れていません。再帰的な結果をrに保存する

x<-matrix(c(1,1,1,1, 
     -1,-1,1,1, 
     -1,1,-1,1), nrow = 4) 
w<-matrix(rep(0,15), nrow = 5) 
d<-c(-1,1,1,1) 

変数

v <- 10L 
y <- 10L 
e <- 10L 
des <- 10L 
m <- 0.5 

初期値はループのアイデアは、私は= Dまでのxのすべての行のためのWの値を見つけることです。ループが表示されているかどうかははっきりしています。

このループは正常に機能していますが、最初の5行だけがループしています。条件(d = i)が満たされるまでxでループしていなければなりません。 私はそれが正しい方法ではないことを知っています。私は何をしたいのかを例示するだけです。その他のオプション(適用)は大歓迎です。

ループ

for(i in 1:4) { 
# Multiplies every row of x by w. The w comes from the result of the loop.  
v[i]<- t(w[i,]) %*% x[i,] 

# Takes the sign of v. 
y[i] <- if(v[i] >= 0) 1 else -1 

# Value to use in the last line of the loop. 
e[i] <- d[i]-y[i] 

des[i] <- if(d[i] == y[i]) 1 else 0 #check if condition is satisfied 
w[i+1,] <- w[i,]+(m*e[i]*x[i,]) 
} 

所望の出力

w <- matrix(c(0,-1,0,1,1,1,1, 
    0,1,0,1,1,1,1, 
    0,1,2,1,1,1,1), nrow=7) 
+0

あなたのコード再現できないとDESでエラー 'エラーを生成します[I] < - もし(D [i]を== Y [i])と他の1 0:オブジェクトのデ" found'ません。再現可能なコードを入力してください。 –

+0

私はパラメータとしてwを渡すように、ループを関数に囲んでいます。その後、元のwを上書きせずに、新しいwを含めて、その関数呼び出しの結果として望むものを返すことができます。それが必要なのかどうかはわかりません。 – Joy

+0

@ Alfredo_MF、 'd'とは何ですか? –

答えて

0

このコードは少し厄介です。必要な出力を提供することが役立つ場合があります。これは、一般的に言えば、行列を操作するときにループの速度が遅くなることを回避できるためです。つまり、これは助けてください

最初の問題は、あなたの初期値を使用していないということです。さらに、v <- 10Lv[2]NAを返すなど、整数をサブセット化しようとしています。以下では、後で使用するすべてのパラメータを事前に割り当てました。

itr_n <- 3 
v <- rep(NA, itr_n) 
y <- rep(NA, itr_n) 
e <- rep(NA, itr_n) 
des <- rep(NA, itr_n) 
res <- matrix(rep(NA, itr_n*itr_n), itr_n, itr_n) # this is a result matric to store 
res[i, ] <- w #populating the row with info before we change w 


for(i in 1:itr_n){ 
    v[i]<- w %*% x[i,] #w[i,] was redundent since w is already a column vector 
    y[i] <- if(v[i] >= 0) 1 else -1 
    e[i] <- d[i] - y[i] 
    des[i] <- if(d[i] == y[i]) 1 else 0 
    res[i+1, ] <- w + (m*e[i]*x[i,]) #storing w in a res matrix 
    w <- res[i+1, ] 
} 
+0

私がアルゴリズムに対して行った変更を、目的の出力で見てください。あなたが提案している製品 'v [i] -w%*%x [i、]'は間違っています。結果は、デカルト行列積(1x1)でなければなりません。 –

関連する問題