Ну, это действительно зависит от того, что вы пытаетесь сделать.Начиная с этого кода, вам может понадобиться подумать о действиях, которые вы делаете, и можете ли вы изменить это поведение.Поскольку фрагмент кода, который вы представляете, показывает небольшие зависимости (то есть, как связаны a, b, что-то и вектор), я думаю, что мы можем представить только расплывчатые решения.
Я подозреваю, что вы хотите избавиться от кода, чтобыобойти эффект постоянного перемещения массива путем объединения в него новых результатов.
Прежде всего, просто убедитесь, что самая медленная часть вашего приложения вызвана этим.Посмотрите на профилировщик Matlab.Если эта часть вашего кода не является основной трудоемкостью, не тратьте много времени на ее улучшение (и просто скажите mlint, чтобы игнорировать эту строку кода).
Если вы можете проанализировать свойкода, достаточного для обеспечения постоянного числа итераций, вы можете предварительно выделить свои переменные и предотвратить любое снижение производительности (т. е. написать цикл for в худшем случае или лучше, но в действительности векторизованный код).Или, если вы можете «выделить» некоторые переменные, это также может помочь (переместить любые инварианты цикла за пределы цикла).Так что это может выглядеть примерно так:
vector = zeros(1,100);
while a - b ~= 0
othervector = sum(something);
vector(iIteration) = sum(othervector);
iIteration = iIteration + 1;
end
Если природа вашего кода не позволяет этого (например, вы выполняете итерацию для достижения сходимости; в этом случае, остерегайтесь проверки равенства двойных чисел: всегда включайтедопуск), есть несколько приемов, которые вы можете выполнить, чтобы улучшить производительность, но большинство из них - это просто эмпирические правила или попытка извлечь максимум из плохой ситуации.В этом последнем случае вы могли бы добавить некоторый код обслуживания, чтобы получить немного лучшую производительность (но то, что вы выигрываете в затратах времени, вы теряете в использовании памяти).
Допустим, вы ожидаете, что код будет выполняться 100 * nБольшую часть итераций вы можете попытаться сделать что-то вроде этого:
iIteration = 0;
expectedIterations = 100;
vector = [];
while a - b ~= 0
if mod(iIteration,expectedIterations) == 0
vector = [vector zeros(1,expectedIterations)];
end
iIteration = iIteration + 1;
vector(iIteration) = sum(sum(something));
...
end
vector = vector(1:iIteration); % throw away uninitialized
vector = vector/100;
Это может выглядеть не очень красиво, но вместо изменения размера массива на каждой итерации, размер массива изменяется только на каждой 100-й итерации.Я не запускал этот кусок кода, но я использовал очень похожий код в предыдущем проекте.