2010-05-11 12 views
7

Mam zmienną a = 1. Chcę, aby wygenerować nazwy zmiennej w postaci:Jak połączyć liczbę z nazwą zmiennej w MATLAB?

variableNumber 

Tak więc w tym przykładzie chciałbym

a1 
a2 
a3 

jako zmienne. Jak mogę to zrobić?

+7

Chociaż jest to oczywiście możliwe (jak już pokazały odpowiedzi), w większości przypadków nie jest to zbyt użyteczne, czy istnieje jakiś powód, dla którego nie można użyć struktury lub macierzy? – groovingandi

+2

Zabawne.Miałem jednego z moich nieprogramistycznych kolegów zadać to samo pytanie w zeszłym tygodniu Moja odpowiedź brzmiała "nie rób", a potem pokazałem mu, jak mógłby użyć tablicy dla ten sam cel. – Kena

+0

Myślę, że należy to wspomnieć: [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

9

Spróbuj genvarname.

varname = genvarname(str) 

to podstawowa składnia do zastosowania. Dokumentacja MATLAB zawiera szczegółowe przykłady użycia tej funkcji z listą wykluczeń (w celu zapewnienia niepowtarzalnych nazw zmiennych). Będziesz musiał użyć eval lub innej funkcji (np. assignin, wspomnianej we wcześniejszej odpowiedzi), aby wykorzystać tę nazwę zmiennej.

Aby całkowicie odpowiedzieć na pytanie,

varnamelist = genvarname({'a','a','a','a','a'}); 
for l=1:length(varnamelist) 
    eval([varnamelist{l} '= l^2']); 
end 

Oczywiście, są bardziej wydajne sposoby układania listy wejściowego dla genvarname, to pozostaje jako ćwiczenie;)

Jeśli jesteś zaniepokojony osiągnięciem, zauważ, że eval może znacznie spowolnić skrypt/funkcję; osobiście polecam korzystanie z typów danych struct lub cell, jeśli potrzebujesz dynamicznego nazewnictwa zmiennych.

+0

Użyj tablic komórkowych, struktur, tablic 3D lub innych sposobów przechowywania danych, ale nie używaj zmiennych zmiennych w obszarze roboczym. – Oleg

5

Użyj assignin.


EDIT: Jak wspomniano JS, kodowanym są na ogół lepsze dla dynamicznych nazw pól. Można ich używać tak:

varnames = {'foo', 'bar'}; 
str = struct; 
for i = 1:length(varnames) 
    str = setfield(str, varnames{i}, rand); %#ok<SFLD> 
end 

str =  
    foo: 0.4854 
    bar: 0.8003 

lub nawet prościej, na przykład:

str2.('alpha') = 123; 
str2.('beta') = 1:10; 
19

Moja odpowiedź na to pytanie brzmi: "Czy na pewno chcesz to zrobić?"

Jeśli masz szereg takich zmiennych, będziesz musiał wymyślić sposób późniejszego odniesienia się do tych zmiennych, co prawdopodobnie będzie oznaczało EVAL lub coś podobnego.

Jeśli wiesz, że wszystko będzie można przechowywać w ten będzie skalarne, można je wszystkie przechowywać w wektorze:

a(1) = 1; 
a(2) = 2; 
a(3) = 3; 

Co jeśli nie masz skalary?

a{1} = 1; 
a{2} = 'Doug'; 
a{3} = [1 2 3 4]; 

Następnie można to określić jako {1} lub cokolwiek innego.

Chyba że masz dobry powód, aby to zrobić, lepiej jest zrobić tablicę komórek, tablicę struktur, wektor lub coś innego.

+0

Należy pamiętać, że dopóki wszystkie pozycje są numeryczne i gwarantują ten sam rozmiar, należy użyć macierzy. Są przechowywane i obsługiwane bardziej wydajnie niż tablice komórek. Mały przykład: 'clear a; a (1,:, :) = rand (3); a (2,:, :) = magia (3) ' –

2

Moja odpowiedź na to pytanie brzmi: "Czy na pewno chcesz to zrobić?"

Ale jeśli Twoja odpowiedź brzmi TAK to jest to odpowiedź:

for k=1:5 
    eval(['a' num2str(k) '= k;']) 
end 
0

Używam tego kodu do aplikacji z Bootstrap sieci neuronowych

% k fold test with automatic division of data 

warning off 

% read in X 
% read in T 

% perform k fold division of input time series called 'K-fold Cross-Validation 
% Bootstrap' 

CVO = cvpartition(X,'k',10); % creates 10 sub samples of 'X' and divides it into 'training (i.e training and validation)' and 'testing' sets 

for i = 1:CVO.NumTestSets 
    eval(['xtv' num2str(i) '=X(CVO.training(i));']) % cross-validation training sets of 'X' 
    eval(['xt' num2str(i) '=X(CVO.test(i));']) % cross-validation testing set of 'X' 
    eval(['ttv' num2str(i) '=T(CVO.training(i));']) % cross-validation training set of 'T' 
    eval(['tt' num2str(i) '=T(CVO.test(i));']) % cross-validation testing set of 'T' 
end 
Powiązane problemy