Вопрос

Я имею в виду пример, подобный этому, у меня есть функция для анализа элементов вектора «вход». Если эти элементы имеют специальное свойство, я храню их значения в векторе «вывода». Проблема в том, что при попрошайничестве я не знаю, какое количество элементов, которые он должен будет хранить в «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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top