Как ускорить объединение массивов? - PullRequest
1 голос
/ 31 марта 2011

Вместо того, чтобы констатировать результаты для этого, есть ли другой способ сделать следующее, я имею в виду, что цикл будет сохраняться, но vector=[vector,sum(othervector)]; можно получить любым другим способом?

vector=[]; 

while a - b ~= 0
  othervector = sum(something') %returns a vector  like [ 1 ; 3 ]
  vector=[vector,sum(othervector)]; 
  ...

end

vector=vector./100

Ответы [ 2 ]

3 голосов
/ 31 марта 2011

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

2 голосов
/ 31 марта 2011

Если вы хотите оптимизировать скорость, вы должны предварительно выделить вектор и иметь счетчик для индекса, поскольку @Egon уже ответил.

Если вы просто хотите использовать другой способ записи vector=[vector,sum(othervector)];,Вы можете использовать vector(end + 1) = sum(othervector); вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...