Одна вещь, чтобы помнить о том, что оптимизация применяются по-разному ли вы работаете из командной строки или с сохраненной M-функцией.
Вот испытание мои:
function testComplex()
tic, test1(); toc
tic, test2(); toc
tic, test3(); toc
tic, test4(); toc
tic, test5(); toc
tic, test6(); toc
end
function a = test1
a = zeros(1e7,1);
for n=1:1e7
a(n) = 2 + 2i;
end
end
function a = test2
a = zeros(1e7,1);
for n=1:1e7
a(n) = 2 + 2j;
end
end
function a = test3
a = zeros(1e7,1);
for n=1:1e7
a(n) = 2 + 2*i;
end
end
function a = test4
a = zeros(1e7,1);
for n=1:1e7
a(n) = 2 + 2*j;
end
end
function a = test5
a = zeros(1e7,1);
for n=1:1e7
a(n) = complex(2,2);
end
end
function a = test6
a = zeros(1e7,1);
for n=1:1e7
a(n) = 2 + 2*sqrt(-1);
end
end
Результатов на моей машине Windows, под управлением R2013a:
>> testComplex
Elapsed time is 0.946414 seconds. %// 2 + 2i
Elapsed time is 0.947957 seconds. %// 2 + 2j
Elapsed time is 0.811044 seconds. %// 2 + 2*i
Elapsed time is 0.685793 seconds. %// 2 + 2*j
Elapsed time is 0.767683 seconds. %// complex(2,2)
Elapsed time is 8.193529 seconds. %// 2 + 2*sqrt(-1)
Обратите внимание, что результаты колеблются немного с разными трассами, где порядок звонки перетасовываются. Поэтому возьмите тайминги с солью.
Мое заключение: не имеет значения с точки зрения скорости, если вы используете 1i
или 1*i
.
одно интересное отличие состоит в том, что если у вас также есть переменная в области видимости функции, где вы также использовать его в качестве мнимой единицы, MATLAB выдает ошибку:
Error: File: testComplex.m Line: 38 Column: 5
"i" previously appeared to be used as a function or command, conflicting with its
use here as the name of a variable.
A possible cause of this error is that you forgot to initialize the variable, or you
have initialized it implicitly using load or eval.
Чтобы увидеть ошибку, изменение выше test3
функции в:
function a = test3
a = zeros(1e7,1);
for n=1:1e7
a(n) = 2 + 2*i;
end
i = rand(); %// added this line!
end
т.е. переменная i
была использована в качестве как функции и переменной в одной и той же локальной области.
Как насчет более общего случая '2 * i' против' 2i' (или даже '2 * 1i')? – horchler
Я вижу улучшение x 5 с R14 на ноутбуке rinky dink с XP. –
Я бы применил 'clear all' до каждого цикла? –