Matlab: как реализовать динамический вектор
-
14-10-2019 - |
Вопрос
Я имею в виду пример, подобный этому, у меня есть функция для анализа элементов вектора «вход». Если эти элементы имеют специальное свойство, я храню их значения в векторе «вывода». Проблема в том, что при попрошайничестве я не знаю, какое количество элементов, которые он должен будет хранить в «Output'so», я не знаю его размера. У меня есть петля, внутри я обнимаю вектор, «ввод» через индекс. Когда я рассматриваю особый элемент этого вектора, захватывает значения «ввода», и он хранится в векторе «обеспечения» через предложение, подобное этому:
For i=1:N %Where N denotes the number of elements of 'input'
...
output(j) = input(i);
...
end
Проблема в том, что я получаю ошибку, если ранее не объявляю «вывод». Мне не нравится «объявлять» «вывод», прежде чем достичь цикла как output = вход, потому что он сохраняет значения от входных актуальны для меня. Кто -нибудь освещает меня в этой проблеме? Спасибо.
Решение
Насколько сложна логика в цикле для цикла?
Если это просто, что -то подобное сработает:
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
Другие советы
Тривиальное решение:
% if input(i) meets your conditions
output = [output; input(i)]
Хотя я не знаю, есть ли это хорошую производительность или нет
Если 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).