2013-08-10 14 views
9

Matlab documentationMatlab değişken olarak, i ve j kullanımı hakkında daha fazla: hız

For speed and improved robustness, you can replace complex i and j by 1i. For example, instead of using

a = i; 

use

a = 1i; 

sağlamlığı kısmı as there might be variables called i or j açık olduğunu söyler. Ancak hız gelince, Matlab 2010b basit bir test yaptık ve ben iddiayı yalanlamak gibi sonuçlar elde:

>>clear all 

>> a=0; tic, for n=1:1e8, a=i; end, toc 
Elapsed time is 3.056741 seconds. 

>> a=0; tic, for n=1:1e8, a=1i; end, toc 
Elapsed time is 3.205472 seconds. 

Herhangi bir fikir? Sürüm ile ilgili bir sorun olabilir mi?

@TryHard ve @horchler yorumlarına sonra bu sonuçlarla, değişken a diğer değerler atayarak çalıştı adres:

Increasing order of elapsed time:

"i" < "1i" < "1*i" (trend "A")

"2i" < "2*1i" < "2*i" (trend "B")

"1+1i" < "1+i" < "1+1*i" (trend "A")

"2+2i" < "2+2*1i" < "2+2*i" (trend "B")

+0

Daha genel olan '2 * i 'vs.' 2i' (veya hatta 2 * 1i') hakkında ne dersiniz? – horchler

+0

Ben XP ile rinky dink dizüstü bilgisayarda R14 ile bir x 5 iyileşme görüyorum. –

+0

Her döngüden önce "tümünü temizle" uygulayabilirim? –

cevap

9

Sana bir patolojik örnek bakıyoruz düşünüyorum. (OSX'te R2012b için gösterilen sonuçları) daha karmaşık bir şey deneyin:

(tekrarlanan ekleme)

>> clear all 
>> a=0; tic, for n=1:1e8, a = a + i; end, toc 
Elapsed time is 2.217482 seconds. % <-- slower 
>> clear all 
>> a=0; tic, for n=1:1e8, a = a + 1i; end, toc 
Elapsed time is 1.962985 seconds. % <-- faster 

(tekrarlanan çarpma) hatırlamak

>> clear all 
>> a=0; tic, for n=1:1e8, a = a * i; end, toc 
Elapsed time is 2.239134 seconds. % <-- slower 
>> clear all 
>> a=0; tic, for n=1:1e8, a = a * 1i; end, toc 
Elapsed time is 1.998718 seconds. % <-- faster 
+13

arasındaki "en yavaş" yerine "Daha karmaşık bir şey deneyin ..." -pun niyetindeyim. :-) – horchler

+0

Söylediğiniz gibi olabilir. Daha sonra, "Hız ve gelişmiş sağlamlık için, karmaşık i ve j'yi 1i ile değiştirebilirsiniz. Örneğin, a = i'yi kullanmak yerine, a = 1i'yi kullanın" ifadesinin kesinlikle yanlış olduğu –

+1

Sağlamlık için, belgeler doğrudur (örneğin, eğer i = 3'ü yanlışlıkla çalıştırıyorsanız, o zaman a = i '3'ü ayarlayacak, ancak' a '1i' i 'yi karmaşık hale getirecek şekilde varsayılan olacaktır, ancak hız nedenlerini neden eklediklerini net olarak kabul etmiyorum. – SheetJS

5

Bir şey optimizasyonlar veya makineden uygulanır olmasıdır komut satırından veya kayıtlı bir M-işlevinden kaçıyorsunuz. R2013a çalıştıran Windows makinemde

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 

sonuç: Burada

kendime ait bir testtir sonuçların farklı pistlere sahip biraz dalgalanma olduğunu

>> 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) 

Not nerede sırası Aramalar karıştırıldı. Bu yüzden zamanlamaları bir tuz parçasıyla al.

Sonucum: 1i veya 1*i'u kullanırsanız hız açısından önemli değil.


ilginç bir fark da ayrıca hayali birimi olarak kullanmak fonksiyonu kapsamında bir değişken varsa, MATLAB bir hata atar şudur:

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. 

hatayı görmek için değişiklik yukardaki test3 fonksiyonu: yani

function a = test3 
    a = zeros(1e7,1); 
    for n=1:1e7 
     a(n) = 2 + 2*i; 
    end 
    i = rand();  %// added this line! 
end 

değişken i bir fonksiyonu ve aynı yerel kapsamında bir değişken hem de kullanılmıştır.

+2

Bahse girerim, bu işlevleri zamanlamadan önce “ısırırsanız”, herhangi bir farklılık gürültüye kaybolacaktır. – horchler

+0

Isınma olsun ya da olmasın, sonuçlar aynıydı: ilk dört yöntem için yaklaşık 0.43 (anlamlı bir fark yok), ardından 0.58 ve 1.2 sırasıyla. Birkaç kez çaldı ve son ikisi ilk dördünden çok daha yavaş. –

+2

true, zamanlamayı ölçtüğüm yol çok doğru değil. Daha iyi bir çözüm, birkaç kez çalıştırılan kodun ısınmasıyla ilgilenen File Exchange'den [TIMEIT] (http://www.mathworks.com/matlabcentral/fileexchange/18798-timeit-benchmarking-function) kullanmaktır. ve arama fonksiyonlarının genel giderlerini göz önünde bulundurarak, sonuçların ortalamasını alırsınız… MATLAB'ın (bilindiği gibi yayın öncesi) bir sonraki versiyonunun bu işlevi doğal olarak içerdiğini bilmekten mutluluk duyarız! – Amro

İlgili konular