2016-08-03 4 views
-1

Ich möchte variable (Typ double) in der folgenden Art und Weise nennen:Matlab: Automatisch mit Namen Zellenarray erstellen mit Bedeutung

k0 = D(1,1); 
k1 = D(2,2); 
k2 = D(3,3); 
k3 = D(4,4); 
k4 = D(5,5); 
k5 = D(6,6); 
k6 = D(7,7); 
k7 = D(8,8); 
... 

bis k99 automatisch for-Schleife. So sehe ich, dass ich Array oder Zelle anstelle von Doppel-Variable mit Eval verwenden sollte, da es langsam ist. Aber wenn ich Array oder Zelle anstelle von Doppel-Variable verwenden sollte, muss ich bei k{1} oder k(1) beginnen, die die Bedeutung verliert, wie ich genau das k0 bezieht sich auf D(1,1), d. H. Die Zahl in meiner Variablen ist 1 weniger. Wie erstelle ich sinnvollen Zellennamen wie k{0}?

Auch sagen, ich habe ein Array A. Es gibt auch einige Male, die ich sinnvolle Variablennamen benötigen, wie

c111 = A(1)*A(1)*A(1) 
c222 = A(2)*A(2)*A(2) 
c333 = A(3)*A(3)*A(3) 

Wie kann ich c{111} effizient for-Schleife?

+0

warten. Sie möchten gegen die Indexkonventionen Ihrer Sprache gehen, * und * die Korrespondenz zwischen Index und Wert weniger direkt machen? Warum bevorzugen Sie 'k (1) = D (2, 2);' über 'k (1) = D (1, 1);'? – user2357112

+0

ja ... das ist nur ein Beispiel. Ich habe auch eine Variable mit negativem Index. – kyle

+0

@ user2357112 ja – kyle

Antwort

1

Antwort 1. Frage: -

D=randn(100); % A matrix of random elements of size 8x8 
for m=0:99 
    assignin('base', ['k' num2str(m)], D(m+1,m+1)) 
end 

Antwort 2. Frage: -

A=randn(1,3); % An array of 3 random elements 
for n=1:3 
    assignin('base', ['c' num2str(111*n)], A(n)^3) 
end 

Kommentare: -
Sie haben, dass Sie angegeben Notwendigkeit Variablen wie k0, k1, k2 ... und c111, c222, c333 aber Sie fragen, wie k{0}, k{1}, k{2}, zu schaffen ... und c{111}, c{222}, c{333}. Soweit es Ihre Bedürfnisse betrifft, habe ich darauf eine Antwort gegeben. In Bezug auf Letzteres ist k{0} nie möglich und c{111}, c{222}, c{333}, ... machen keinen Sinn ohne die Verwendung der ersten 0: 100 Werte und dann 112: 221 Werte und so weiter. Auch wenn Sie es tun können, mit:

A=rand(1,3);  % An array of 3 random elements 
c{333} = 0 ;  % Pre-allocation 
for p=1:3   % Since you want to use a 'for loop' 
    c{111*p} = A(p)^3; 
end 

Und in Bezug auf die Anforderung, dass Sie in dem Kommentar in diesen Worten gemacht „Ich habe auch einige Variable mit negativem Index“, kann man nie Variablen im negativen Index hat. Wenn Sie meinen, dass Sie Variablen mit Namen wie k-1, k-2, ... usw. erstellen möchten, ist dies nicht möglich. Ein alternativer Weg ist, k_1, k_2, ... usw. zu verwenden, aber dann, wie Sie in der Frage sagten "k0bezieht sich auf D(1,1), d.h. die Zahl in meiner Variablen ist 1 weniger". Es bedeutet k_1 bezieht sich auf D(0,0) und so weiter, was wiederum eine ungültige Sache für MATLAB ist.

Empfehlung: -
Sie müssen wirklich Ihren Code ändern.

1

Nutzungsstrukturen:

D = rand(21); 
c = 1; 
for k = -10:10 
    if k<0 
     s.(['k_' num2str(abs(k))]) = D(c,c); 
    else 
     s.(['k' num2str(k)]) = D(c,c); 
    end 
    c = c+1; 
end 

Dies wird Ihnen wie eine Struktur geben:

s = 

    k_10: 0.51785 
    k_9: 0.90121 
    k_8: 0.40746 
    k_7: 0.092989 
    . 
    . 
    k_1: 0.75522 
    k0: 0.55257 
    k1: 0.28708 
    . 
    . 
    k9: 0.94182 
    k10: 0.2124 

und tun eval nicht verwenden ...

+0

Dies wird Probleme mit dem negativen k, denke ich. Wie auch immer, das wäre es, was ich sonst lieber hätte, wenn ich aus irgendeinem Grund sehr viele Variablen benötige. – patrik

+1

@patrik Ich habe etwas bearbeitet, aber Sie können nicht eine Variable/ein Feld haben, das mit '-' benannt ist, also ist es albern, auf dieser Nomenklatur zu beharren. Aus welchem ​​Grund auch immer das OP so viele Variablen deklarieren musste, ich denke, das ist ein besserer Weg, dies zu tun. – EBH

+0

Richtig stimme ich da völlig überein. Es ist oft der bessere Weg. Meine Vermutung ist, dass das OP wirklich eine Art Karte anfordert. Ich glaube nicht, dass die angeforderte Datenstruktur tatsächlich existiert (in irgendeiner Sprache). – patrik

Verwandte Themen