2016-03-29 8 views
-1

Ich habe den folgenden Code mit mir. Dieser Code wurde ursprünglich in MATLAB geschrieben. Ich habe zwei Fragen hier:MATLAB zu R Konvertierung: Anhängen von Werten an ein vorhandenes leeres Array durch for-Schleife

1) Was wäre der entsprechende Befehl in R für den folgenden Befehl in MATLAB sein:

duet(i).p = [];  

2) Im folgenden Code, den ich alle richtigen 6 Werte für duet$n bin immer , aber ich bekomme keine korrekten Werte für duet$p. Meine Frage ist, wie man die Werte an ein leeres existierendes Array duet$p[i] in R durch die for-Schleife-Iterationen anfügt.

Diese Linie arbeitet nicht in dem unten stehenden Code:

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

ich auch duet$p[i] <- array() erklärt haben, falsch könnten.

Die Werte für duet.n und duet.p von MATLAB sind:

duet.n 
    2 0 2 0 1 3 

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

In R, erhalte ich duet$n Werte richtig, aber ich bin nicht in der Lage die Array Art von Ergebnissen für duet$p zu bekommen.

Jede Hilfe, die duet$p Werte erhalten würde geschätzt.

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

„Anhängen von Werten an ein vorhandenes leeres Array durch for-Schleife“ 1) Sie sollten sehr hart versuchen, eine vektorisiert Alternative zu der Schleife zu finden. 2) Sie sollten niemals ein Objekt in einer Schleife wachsen lassen (das ist eine der langsamsten Operationen, die in einer Programmiersprache möglich ist), wenn Sie die endgültige Größe kennen oder schätzen können. Ordnen Sie die Datenstruktur vor und füllen Sie sie aus. Wie auch immer, anstatt einer engen Übersetzung von Matlab-Code, überlegen Sie, was dieser Code macht, schreiben Sie ihn auf eine R-ish-Art um und testen Sie, ob der R-Code identische Ergebnisse liefert. – Roland

Antwort

1

Dies scheint die Ausgabe, die Sie erhalten möchten:

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) 
    } 
} 

Was habe ich getan?

  • die Linie x[i,6] =1 Kommentar gesetzt, weil es keine x[i,6] ist, und ich bin nicht sicher, was Sie es sein soll. Sie müssen dies aussortieren.
  • Initialised Duett $ n als ein Vektor
  • Initialised Duett $ p als eine Liste von n leeren Vektoren
  • die k Schleife als bedingte Zählen in R entfernt ist als die Summe der Elemente durchgeführt werden, in dem die Bedingung TRUE ist .
  • die Syntax für Schleifen korrigiert: =in wurde
+0

Danke, dieser Teil hat perfekt funktioniert. Ich habe die Bearbeitung für x [i, 6] = 1 nach meinen Anforderungen gemacht. Das Wichtigste war die Deklaration des Duetts $ p.Versuche, einige der Befehle zu lernen, die du benutzt hast. Wenn ich das komplett verstehe, kann nur ich zu meinem nächsten Abschnitt des Skripts springen. Ich muss so viel lernen. :) Vielen Dank noch mal!! –

-1

Ich glaube, Sie versuchen duet[i]$p statt zu tun, was du tust. Darüber hinaus müssen Sie jede Zelle als eine Liste initialisieren

+1

Dies ist keine Antwort. Im besten Fall ist es ein Kommentar. – Roland

Verwandte Themen