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ć?
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ć?
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.
Użyj tablic komórkowych, struktur, tablic 3D lub innych sposobów przechowywania danych, ale nie używaj zmiennych zmiennych w obszarze roboczym. – Oleg
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;
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.
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) ' –
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
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
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
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
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