Matlab: как реализовать динамический вектор - PullRequest
4 голосов
/ 30 декабря 2010

Я ссылаюсь на такой пример У меня есть функция для анализа элементов вектора, «вход». Если эти элементы имеют специальное свойство, я сохраняю их значения в векторе 'output'. Проблема в том, что в начале я не знаю, сколько элементов нужно будет хранить в 'output's, так что я не знаю его размера. У меня есть цикл, внутри я обхожу вектор, «вход» через индекс. Когда я рассматриваю специальный, некоторый элемент этого вектора захватывает значения 'input' и хранится в векторе 'ouput' через такое предложение:

For i=1:N %Where N denotes the number of elements of 'input'
...
output(j) = input(i);
...
end

Проблема в том, что я получаю сообщение об ошибке, если я ранее не "объявлял" 'выходные данные'. Я не хотел бы «объявлять» «выход» до того, как достигнет цикла как output = input, потому что он хранит значения из ввода, в которых я не заинтересован, и я должен подумать, как удалить все значения, которые я сохранил, которые не имеют отношение ко мне. Кто-нибудь освещает меня по этому вопросу? Спасибо.

Ответы [ 3 ]

7 голосов
/ 30 декабря 2010

Насколько сложна логика в цикле for?

Если все просто, что-то вроде этого будет работать:

output = input ( logic==true )

В качестве альтернативы, если логика сложная и вы имеете дело с большими векторами, я бы заранее выделил вектор, в котором хранится, сохранить элемент или нет. Вот пример кода:

N = length(input); %Where N denotes the number of elements of 'input'
saveInput = zeros(1,N);  % create a vector of 0s
for i=1:N
    ...
    if (input meets criteria)
        saveInput(i) = 1;
    end
end
output = input( saveInput==1 ); %only save elements worth saving
2 голосов
/ 30 декабря 2010

Тривиальное решение:

% if input(i) meets your conditions
output = [output; input(i)]

Хотя я не знаю, хорошая ли это производительность или нет

1 голос
/ 30 декабря 2010

Если N не слишком большой, чтобы вызвать проблемы с памятью, вы можете предварительно присвоить output вектору того же размера, что и input, и удалить все ненужные элементы в конце цикл.

output = NaN(N,1);
for i=1:N
...
output(i) = input(i);
...
end
output(isnan(output)) = [];

Есть две альтернативы

Если output будет слишком большим, если ему назначен размер N, или если вы не знаете верхний предел размера output, вы можете сделать следующее

lengthOutput = 100;
output = NaN(lengthOutput,1);
counter = 1;
for i=1:N
   ...
   output(counter) = input(i);
   counter = counter + 1;
   if counter > lengthOutput
       %# append output if necessary by doubling its size
       output = [output;NaN(lengthOutput,1)];
       lengthOutput = length(output);
   end
end
%# remove unused entries
output(counter:end) = [];

Наконец, если N мало, то прекрасно позвонить

output = [];
for i=1:N
   ...
   output = [output;input(i)];
   ...
end

Обратите внимание, что производительность резко падает, если N становится большим (скажем,> 1000).

...