MATLAB: Как я могу использовать значение переменной в другом имени переменной? - PullRequest
3 голосов
/ 27 июля 2010

Мне интересно, возможно ли это? Мой код выглядит так:

indexStop = find(firstinSeq(x,4) ~= ...
                 littledataPassed(y:length(littledataPassed),4), 1, 'first');
for z= 0:(n-1)
   indexProcess = find((littledataPassed(y:y+indexStop-1,6) == 1 & ... 
      littledataPassed(y:y+indexStop-1,2) == firstinSeq(x,2) & ... 
      littledataPassed(y:y+indexStop-1,5) == z), 1, 'first'); 
   if isempty(indexProcess)
      msgLength[n](countmsgLength[n],:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
   else
      msgLength[n](countmsgLength[n],:)= [firstinSeq(x,:) ...
         littledataPassed(y+indexProcess-1,:)];
   end
   countmsgLength[n]= countmsgLength[n] + 1;
end

Я надеюсь, что везде, где написано [n], будет установлено действительное значение n, чтобы я мог использовать это для добавления данных к девяти различным переменным в формате msgLength#. Я пробовал искать учебники, а что нет, но ничего не видел по теме.

Ответы [ 2 ]

8 голосов
/ 27 июля 2010

Почти всегда лучше использовать массивы или массивы ячеек для хранения данных, чем создавать набор переменных с именами a1, a2, a3 и т. Д. Например, вы можете инициализироватьmsgLength как массив ячеек с n элементами:

msgLength = cell(1,n);

И вы можете получить доступ к ячейкам msgLength, используя фигурные скобки:

msgLength{n} = ...  %# Assign something to cell n

Ваша переменная countmsgLength можетпросто быть обычным числовым массивом, так как он, кажется, хранит только n значений.Вам просто нужно заменить квадратные скобки на круглые скобки (то есть [n] на (n)).


Однако , если вы действительно хотитесоздайте n отдельные переменные, вы, скорее всего, в конечном итоге будете использовать функцию EVAL . Этот вопрос и Этот вопрос показывают некоторые примеры того, как создавать имена переменных, используя значение другой переменной.

0 голосов
/ 28 июля 2010

Если вам абсолютно необходимо использовать несколько переменных, структура динамические имена полей с использованием нотации () будет полезна.Если вы введете следующее:

>> n = 1;
>> data.(sprintf('msgLength%u', n)) = [1 2 3 4];
>> n = 2;
>> data.(sprintf('msgLength%u', n)) = [5 6 7 8];

Вы получите структуру с двумя полями:

>> data
data = 
   msgLength1: [1 2 3 4]
   msgLength2: [5 6 7 8]

Несмотря на это, я во-вторых предлагаю gnovice использовать массив для хранения данных вместонесколько переменных.Вы можете просто добавить другое измерение к msgLength, чтобы строка 7 стала:

msgLength(n,countmsgLength(n),:)= [firstinSeq(x,:) [0 0 0 0 0 0]];
...