2017-04-02 2 views
0

Ich bin Trans-Code von Matlab zu r. Ich habe Code, der in Matlab C-ähnliche Struktur ist.Wie c ähnliche Struktur in r zu verwenden

for i = 1:m0      
    Ent(i).connums = m0 - 1;  % number of neighbours 
    Ent(i).con = [1:i-1 i+1:m0]'; % neighbour list 
    Ent(i).H = [];     
    Ent(i).L = [];     
end 

Ent in Code über eine C artige Struktur Array. Ich versuche, eine Grafik als nebenstehende Liste zu speichern. In r versuchte ich eine Liste von Listen zu verwenden. Say, Ent ist eine Liste von Listen enthält Knoten. Unterlisten in Ent ist eine Liste mit einer Knoten Detailinformation.

Was ich versucht:

rm(list = setdiff(ls(), lsf.str())) 
m0<-4 
Ent <- list() 

for (i in seq(1, m0))      
{ 
    connums <- m0 - 1      
    if (i + 1 > m0)        
    { 
     con <- seq(1,i-1) 
    } 
    else if (i - 1 < 1) 
    { 
     con <- c(seq(i+1,m0)) 
    } 
    else 
    { 
     con <- c(seq(1,i-1), seq(i+1,m0)) 
    } 

    H <- 0        
    L <- 0        
    Ent <- c(Ent, list(n=i, connums=connums, con=con, H=H, L=L)) 
} 
Ent 
is.list(Ent) 
is.vector(Ent) 
print(length(Ent)) 

for (f in Ent) 
{ 
    print(f) 
} 

die Ergebnisse:

> Ent 
$n 
[1] 1 

$connums 
[1] 3 

$con 
[1] 2 3 4 

$H 
[1] 0 

$L 
[1] 0 

$n 
[1] 2 

$connums 
[1] 3 

$con 
[1] 1 3 4 

$H 
[1] 0 

$L 
[1] 0 

$n 
[1] 3 

$connums 
[1] 3 

$con 
[1] 1 2 4 

$H 
[1] 0 

$L 
[1] 0 

$n 
[1] 4 

$connums 
[1] 3 

$con 
[1] 1 2 3 

$H 
[1] 0 

$L 
[1] 0 

> is.list(Ent) 
[1] TRUE 
> is.vector(Ent) 
[1] TRUE 
> print(length(Ent)) 
[1] 20 
> for (f in Ent) 
+ { 
+ print(f) 
+ } 
[1] 1 
[1] 3 
[1] 2 3 4 
[1] 0 
[1] 0 
[1] 2 
[1] 3 
[1] 1 3 4 
[1] 0 
[1] 0 
[1] 3 
[1] 3 
[1] 1 2 4 
[1] 0 
[1] 0 
[1] 4 
[1] 3 
[1] 1 2 3 
[1] 0 
[1] 0 

Warum die Länge Ent 20 ist? Die Liste scheint unlist zu sein. Mein erwartetes Ergebnis könnte Unterlisten in einer Liste sein. Die Länge von Ent der Unterliste sollte 4 sein. Ich habe diese solution gelesen und kann immer noch meine Lösung nicht finden. Ist es möglich, c wie Struktur in r zu speichern? wie geht das? Irgendwelche alternativen Lösungen?

+0

Wenn Sie diese Frage downvote, lassen Sie einen Kommentar um mich den Grund wissen zu lassen. Vielen Dank. –

Antwort

1

Die Länge der Liste ist 20 wegen Ent <- c(Ent, list(n=i, connums=connums, con=con, H=H, L=L)). Hier verketten Sie die Liste mit der vorherigen Liste. Sie verketten die spezifischen Elemente der Listen nicht miteinander. Wenn also Ent die Länge 0 hat, wird 5 hinzugefügt. Dies geschieht, 4-mal (seit length(seq(1, m0)) = 4) und 4 * 5 = 20. Wenn Sie auf eine bestimmte elemnt in Ent anhängen, könnten Sie versuchen:

Ent$H = c(Ent$H, ...) # replace ... with values to append 
Ent$L = c(Ent$L, ...) 
+0

Es ist eine gute Alternative für Ent $ H. Was ist mit Ent $ con? Es ist kein Wert; es ist eine Sequenz. –

+0

Unter der Annahme, dass die Sequenz immer die gleiche Länge hat, könnten Sie versuchen, "Ent $ con = rbind (Ent $ con, con)", die es in eine Matrix bindet. Wenn es nicht immer die gleiche Länge hat, können Sie es zu einer verschachtelten Liste machen, wobei 'Ent $ con' eine Liste und 'Ent $ con [[1]]' die erste Sequenz ist, 'Ent $ con [[2 ]] 'ist der zweite, usw. Das können Sie über' Ent $ con = c (Liste (Ent $ con), Liste (con)) 'tun. – Vandenman

+0

Die Länge der Con ist nicht festgelegt. 'Ent $ con = c (Liste (Ent $ con), Liste (con))' konnte nicht das erwartete Ergebnis erhalten. 'a <-list (1,2); a <-c (Liste (a), Liste (Liste (3,4))); a <-c (Liste (a), Liste (Liste (5,6))) '. Egal wie viele Möglichkeiten ich versuche, es konnte nicht das erwartete Ergebnis erzielen. Ich überprüfe die Frage [Ein Objekt an eine Liste in R in der amortisierten konstanten Zeit anhängen, O (1)] (http://stackoverflow.com/questions/2436688/append-an-object-to-a-list- in-r-in-Amortized-Konstante-Zeit-o1). 'a <-list(); Eine [[length (a) +1]] <- list (5,6) 'sollte auf eine niedrige Effizienz Weise funktionieren. Wie auch immer, es funktioniert. –