не обязательно оптимизация скорости, но некоторые примечания:
- используйте
pi
, а не 3.14159 или 3.1415927
- обычно вы можете векторизовать свои циклы:
nonvectorized:
for i = 1:leiterelemente+1;
leiter(i,1) = i * steigung / (genauigkeit * 2 * 3.1415297) + matrix/2 - spulenlaenge/2; % x-Ausrichtung
leiter(i,2) = radius * cos(i/genauigkeit) + matrix/2; % y-Ausrichtung
leiter(i,3) = radius * sin(i/genauigkeit); % z-Ausrichtung
end
векторизации:
ii = 1:leiterelemente+1;
leiter(ii,1) = ii * steigung / (genauigkeit * 2 * 3.1415297) + matrix/2 - spulenlaenge/2; % x-Ausrichtung
leiter(ii,2) = radius * cos(ii/genauigkeit) + matrix/2; % y-Ausrichtung
leiter(ii,3) = radius * sin(ii/genauigkeit); % z-Ausrichtung
Большинство функций matlab принимают векторы / матрицы в качестве аргументов, включая cos()
, sin()
, exp()
, log()
и т. Д.
Для небольшого количества элементов (скажем, <несколько сотен) может быть не стоит усилий по векторизации. </p>
Величина вектора: вместо sqrt(dB(1).^2 + dB(2).^2 + dB(3).^2)
используйте norm(dB)
(учтите, что норма действует не на матрицу построчно, а в целом), хотя это не сильно сэкономит
B(x,y,z,1) = B(x,y,z,1) + dB(1);
B(x,y,z,2) = B(x,y,z,2) + dB(2);
B(x,y,z,3) = B(x,y,z,3) + dB(3);
рассмотрите возможность изменения на
B (x, y, z, 1: 3) = B (x, y, z, 1: 3) + дБ (1: 3);
Почему вы вычисляете r с использованием квадратного корня, когда вы просто возводите его в квадрат позже?
r = sqrt(vecrminusvecs(1).^2 + vecrminusvecs(2).^2 + vecrminusvecs(3).^2);
Изменить на
r2 = sum(vecrminusvecs.^2);
и используйте r2
вместо r.^2
Полагаю, вы, вероятно, можете упростить вычисления с "vecrminusvecs = ..." до "db = konstante ...", используя некоторую векторную алгебру; Вы делаете некоторые изменения масштаба, которые не кажутся необходимыми или, по крайней мере, могут быть оптимизированы для скорости.
edit : теперь я с подозрением отношусь к "норме"; sqrt(sum(x.^2,2))
работает с каждой строкой и, вероятно, быстрее, чем norm()
, но вы должны измерить его, если хотите использовать самый быстрый подход.