Permalänk
Medlem

Numrering av struct i Matlab

Hej,
Behöver hjälp med struct i Matlab.

När man definierar en struct med ett index i arrayen så skapas likadana tomma structurer från index 1 till det man definierar. Är det möjligt att definiera ett intervall som man vill att indexet ska vara giltigt?

Tex. om jag skapar

Struct(6000001).test = 1;
så får jag 6000000 tomma structurer på köpet som jag inte vill ha.

Ett alternativ är att skapa en funktion eller array som konverterar indexet så att t.ex. 6000001 = 1, o.s.v., men det är inte ett snyggt sätt.

Vore mycket tacksam för en lösning på mitt problem.

Visa signatur

Asus P8H67-I Deluxe | Intel i5 2500K@-0.185 VCore with Scythe Kozuti | 8GB DDR3 1333Mhz | inside OrigenAE M10
MSI K8N SLI | Athlon 64 X2 3800+@2,5GHz | TwinMOS PC3200 DDR 2GB | XFX GeForce 7600GS

Permalänk
Medlem

Var ett tag sedan jag höll på med det.. men tror inte det tyvärr.. kollade lite här , kanske kan hjälpa.

Permalänk
Medlem

Du vill alltså ha en gles struct, tyvärr finns inte denna datastruktur i matlab.
Om det är ett begränsat intervall som du antyder till i frågan kan du göra så enkelt som att bara subtrahera en konstant.

Kommer structen bli överlag gles så kan du använda en vanlig gles vector för indirekt addressering.
Om du väljer den senare metoden får du hålla koll på ett extra index som du inkrementerar vid varje skrivning till ett nytt värde.

Tänk på att den glesa adresseringsvektorn då skall vara en kolumnvektor, då dessa tar betydligt mindre plats.
Exempel;

>> x x = (1,1) 3 (10,1) 3 (100,1) 3 (10000,1) 3 (100000,1) 3 >> xp xp = (1,1) 3 (1,10) 3 (1,100) 3 (1,10000) 3 (1,100000) 3 >> whos Name Size Bytes Class Attributes x 100000x1 176 double sparse xp 1x100000 800088 double sparse

Permalänk
Medlem

Tack för ditt tydliga svar Micket, det är precis en gles struct jag hade önskat. Indirekt adressering var det jag hade velat undvika, men det får nog bli det som jag använder.

Helst skulle man då vilja ha en syntax som gör det lite smidigare.

Istället för att skriva
S(x(10000)).field för att komma åt t.ex. S(3).field så skulle jag vilja att matlab förstår att när jag skriver x(10000).field så betyder det S(x(10000)).field, men inte heller det lär väl fungera förstår jag, då det är en helt främmande syntax att anropa en array som en struct.

Visa signatur

Asus P8H67-I Deluxe | Intel i5 2500K@-0.185 VCore with Scythe Kozuti | 8GB DDR3 1333Mhz | inside OrigenAE M10
MSI K8N SLI | Athlon 64 X2 3800+@2,5GHz | TwinMOS PC3200 DDR 2GB | XFX GeForce 7600GS

Permalänk
Medlem

Detta räcker inte hela vägen fram, men;

f = @(i) S(x(i))

men det är oerhört begränsat, den måste defineras efter x och S, och du kan inte direkt få tillgång till fältet utan måste spara i en temporär variabel först.
alterantivt finns

f = @(i,field) getfield(S(x(i)), field)

men då måste du fortfarande skriva
f(10000,'field')

Du hittar nog inget som är mer elegant än S(x(...)).field

Syntaxen i matlab är inte alltid genomtänkt, så detta vore inte första gången en elegant lösning ej finns.