2016-03-29 6 views
-1

私は私と一緒にコードを持っています。このコードはもともとMATLABで書かれていました。私はduet$nのために、すべての正しい6つの値を取得しています以下のコードでは)MATLABからRへの変換:forループを介して既存の空の配列に値を追加

duet(i).p = [];  

2:MATLABで以下のコマンドのためにRで対応するコマンドであるもの

1):私はここに二つの質問を持っていますしかし、私はduet$pの正しい値を得ていません。私の質問は、ループ内の反復によって、R内の空の既存の配列duet$p[i]に値を追加する方法です。この行は、以下のコードで動作していない

duet$p[i] <- c(duet$p[i],j) 

また、私は間違ってduet$p[i] <- array()を宣言している場合があります。 MATLABからduet.nduet.pため

値は次のとおりです。Rで

duet.n 
    2 0 2 0 1 3 

duet.p 
    [] [3,6] [] [1,3,5,6] [1,6] [] 

、私は正しくduet$n値を取得していますが、私はduet$pのために、結果の配列の種類を取得することはできませんよ。

duet$p値を取得するための助けがあれば幸いです。

x <- matrix(c(-1,2,4,1,7,4.2,3,0,1.2,-1.2,5.1,4,2,3.1,1.1,1,1,9,0,1,2,2,8,1,2,2,2,2,2,2),nrow=6,ncol=5,byrow=T) 
fro=1;N=6;M=2;V=3; 
F <- list(f=c()) 
duet = list() 
for (i = 1 : N){ 
duet$n[i] = 0 
duet$p[i] = array() ## Create an empty array 
     for (j in 1 : N){ 
      dl = 0 
      de = 0 
      dm = 0 
      for (k = 1 : M){ 
       if (x[i,V + k] < x[j,V + k]){ 
         dl = dl + 1 
       } else if (x[i,V + k] == x[j,V + k]){ 
         de = de + 1 
       } else{ 
         dm = dm + 1 
      } 
     } 
    if (dl == 0 & de != M){ 
     duet$n[i] = duet$n[i] + 1 
    } else if (dm == 0 & de != M){ 
     duet$p[i] = c(duet$p[i],j) 
    } 
} 
if (duet$n[i] == 0){ 
    x[i,6] = 1 
    F$f = c(F$f,i) 
} 
} 
+0

inになりました。 2)最終的なサイズを知っているか、見積もっていれば、ループ内のオブジェクトを決して成長させるべきではありません(プログラミング言語で可能な最も遅い操作の1つです)。データ構造を事前に割り当てて入力します。とにかく、Matlabコードの翻訳の代わりに、そのコードが何をしているのかを考え、R-ishの方法で書き直して、Rコードが同じ結果を出すかどうかをテストします。 – Roland

答えて

1

として各セルを初期化する必要があります。

x <- matrix(c(-1,2,4,1,7,4.2,3,0,1.2,-1.2,5.1,4,2,3.1,1.1,1,1,9,0,1,2,2,8,1,2,2,2,2,2,2),nrow=6,ncol=5,byrow=T) 
fro=1;N=6;M=2;V=3; 
F <- list(f=c()) 
duet = list(n=rep(0,N), p=lapply(1:N, function(x)c())) 
for (i in 1 : N){ 
    duet$n[i] = 0 
    #duet$p[[i]] = c() ## Create an empty array 
    #if(i==2) browser() 
    for (j in 1 : N){ 
    k=1:M 
    dl <- sum(x[i,V + k] < x[j,V + k]) 
    de <- sum(x[i,V + k] == x[j,V + k]) 
    dm <- sum(x[i,V + k] > x[j,V + k]) 

    if (dl == 0 & de != M){ 
     duet$n[i] = duet$n[i] + 1 
    } else if (dm == 0 & de != M){ 
     duet$p[[i]] = c(duet$p[[i]],j) 
    } 
    } 
    if (duet$n[i] == 0){ 
    #x[i,6] = 1 
    F$f = c(F$f,i) 
    } 
} 

は、私が何をしましたか? x[i,6]がないので

  • は、ラインx[i,6] =1をコメントアウトし、私はあなたがそれがために何を意味するのかわかりません。 これを整理する必要があります。 Rの条件カウント条件がTRUEある要素の和として行うことができるようにn空ベクター
  • のリストは、kループを除去するようにベクター
  • 初期化デュエット$ pとしてデュエット$ nを初期化
  • forループの構文を修正:=は、1)あなたはループのベクトル化の代替を見つけるために非常に努力すべきである「forループによって、既存の空の配列に値を追加し、」
+0

ありがとう、その部分は完全に働いた。私はx [i、6] = 1の編集を自分の要件に従って行っています。重要なことは、デュエット$ pの宣言であった。あなたが使用したコマンドのいくつかを習得しようとしています。私がこれを完全に理解していれば、自分が持っているスクリプトの次のセクションにジャンプすることができます。これからたくさん学ぶことができました。 :)もう一度ありがとう! –

-1

は私があなたの代わりに何をやっているのduet[i]$pをやろうとしていると思います。また、あなたはこれがあなたが望む出力を得るために表示されたリスト

+1

これは答えではありません。最高でそれはコメントです。 – Roland

関連する問題