2013-04-19 9 views
15

Załóżmy, że chcę utworzyć 10 zmiennych, które będzie wyglądać następująco:Tworzenie zmiennych o nazwach od strun

x1 = 1; 
x2 = 2; 
x3 = 3; 
x4 = 4; 
. 
. 
xi = i; 

Jest to uproszczona wersja tego, co mam zamierzając zrobić. Zasadniczo po prostu chcę zapisać linie kodu, tworząc te zmienne w sposób zautomatyzowany. Czy istnieje możliwość skonstruowania nazwy zmiennej w Matlab? Wzorzec w moim przykładzie byłby następujący: ["x", num2str(i)]. Ale nie mogę znaleźć sposobu na utworzenie zmiennej o tej nazwie.

+3

Zobacz FAQ MATLAB: [Jak utworzyć zmienne A1, A2, ..., A10 w pętli?] (Http://matlab.wikia.com/wiki/FAQ#How_can_I_create_variables_A1.2C_A2.2C ....2CA10_in_a_loop .3F) – Amro

Odpowiedz

28

Można to zrobić z eval ale naprawdę powinien nie

eval(['x', num2str(i), ' = ', num2str(i)]); %//Not recommended 

Zamiast używać tablicy komórek:

x{i} = i 
+0

Wow dzięki, bardzo proste. I tak, użyję komórek, ale także tej metody, którą tu przedstawiłeś;) – Cat

+12

Naprawdę zniechęcam cię do używania eval do pop przyrostowych zmiennych w twoim obszarze roboczym. Jeśli chcesz nazwę utworzyć strukturę: 's. (Sprintf ('x% d', i)) = i;' – Oleg

+0

dlaczego nie jest to zalecane? –

5

ja również zdecydowanie doradzamy przy użyciu tablicę komórek lub struct dla takich przypadki. Myślę, że da ci to trochę poprawy wydajności.

Jeśli naprawdę tego potrzebujesz, Dan powiedział, jak to zrobić. Ale chciałbym również wskazać na funkcję genvarname. Upewni się, że twój ciąg znaków jest poprawną nazwą zmiennej.

EDIT: genvarname jest częścią podstawowych Matlab, a nie z przybornika statystyki

+0

Dzięki. Zamiast komórek użyję tablic. Przykład w moim pytaniu był po prostu bardzo prosty, aby mieć łatwe pytanie o informacje, których szukam. To, co robię, nie jest tak naiwne jak moje pytanie: p – Cat

+0

@bdecaf: btw 'genvarname' jest częścią core MATLAB – Amro

+0

o mój zły. Mógłbym przysiąc, że to część tego zestawu narzędzi. – bdecaf

1

Jeśli ktoś jest zainteresowany, poprawna składnia z odpowiedzią Dana byłoby:

eval(['x', num2str(i), ' = ', num2str(i)]); 

Moje pytanie już zawarte niewłaściwym składnia, więc to moja wina.

+3

W przyszłości możesz edytować moją odpowiedź, jeśli wystąpią drobne błędy. Na dole znajduje się link do edycji. Jeśli nie masz wystarczającej reputacji, możesz po prostu zostawić komentarz, a ktoś inny dokona dla ciebie edycji. Naprawiłem teraz moje;) – Dan

0

Potrzebowałem czegoś takiego, ponieważ nie możesz odwoływać się do struktur (lub tablic komórek, które zakładam) z obszaru roboczego w blokach Simulink, jeśli chcesz móc je zmienić podczas symulacji.

W każdym razie, dla mnie to najlepiej pracował

assignin('base',['string' 'parts'],values); 
4
for k=1:10 
    assignin('base', ['x' num2str(k)], k) 
end 
+0

sugerują zmianę "bazy" na "dzwoniący". W ten sposób, AIUI, powinno działać wszędzie, gdzie ktoś nie zwraca szczególnej uwagi na obszary robocze. – Flyto

1

Mimo że jest od dawna, i justed chciał dodać kolejną odpowiedź.

genvarname funkcja jest dokładnie dla tych przypadkach

i jeśli używasz go z tablicy struktury tmp nie trzeba eval cmd

przykładzie 4 z tym linkiem jest jak to zrobić http://www.mathworks.co.uk/help/matlab/ref/genvarname.html

for k = 1:5 
    t = clock; 
    pause(uint8(rand * 10)); 
    v = genvarname('time_elapsed', who); 
    eval([v ' = etime(clock,t)']) 
    end 

wszystkiego najlepszego

Eyal

Powiązane problemy