Как оптимизировать расчет нормы в Matlab? - PullRequest
1 голос
/ 08 сентября 2010

Я хотел оптимизировать следующий код Matlab:

x = пробел (-5,5100);
у = пробел (-5,5100);
z = пробел (-5,5100);
[xp, yp, zp] = сетка (x, y, z);

norm = sqrt (xp. ^ 2 + yp. ^ 2 + zp. ^ 2);

Я немного улучшил его, используя realsqrt:

norm_0 = sqrt (xp. ^ 2 + yp. ^ 2 + zp. ^ 2) 10,106 с 37,0%
norm_1 = realsqrt (xp. ^ 2 + yp. ^ 2 + zp. ^ 2) 10 100 с 35,0%

Есть еще идеи?

Ответы [ 3 ]

3 голосов
/ 09 сентября 2010
  • sqrt() стоит дорого, поэтому убедитесь, что он вам действительно нужен, или, как указал Йонас, если вы могли бы вместо этого установить пороговое значение для квадрата радиуса

  • в зависимости от ваших данных, используйте знания о симметрии нормы, чтобы уменьшить количество вычислений sqrt

  • предварительно рассчитать квадраты перед генерацией сетки

что-то вроде (не проверено):

x = linspace(-5, 5, 100);
y = linspace(-5, 5, 100);
z = linspace(-5, 5, 100);
[xp2, yp2, zp2] = meshgrid(x(1:end/2).^2, y(1:end/2).^2, z(1:end/2).^2);
norm_quadrant = sqrt(xp2 + yp2 + zp2);
norm_temp1 = cat(1, norm_quadrant, flipdim(norm_quadrant, 1));
norm_temp2 = cat(2, norm_temp1, flipdim(norm_temp1, 2));
norm_complete = cat(3, norm_temp2, flipdim(norm_temp2, 3));
1 голос
/ 08 сентября 2010

Я сомневаюсь, что эту отдельную линию можно оптимизировать очень сильно.Однако, для того, чтобы это заняло 10 секунд, я предполагаю, что он вызывается внутри цикла, что предполагает, что есть потенциал для оптимизации всей функции.

Кроме того, вы можете попытаться создать круг где-то позжепорог радиуса.Вместо того, чтобы брать квадратный корень, вы могли бы вместо порога против квадрата радиуса сделать код таким образом быстрее.

0 голосов
/ 08 сентября 2010

Просто используйте стандартную функцию нормы, она, вероятно, реализована с использованием C, что делает его более быстрым, чем выполнение многих действий в Matlab.

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