En soldaki endeksin en hızlı şekilde değişmesinin neden daha verimli olduğunu açıklayan biraz daha uzun bir cevap. Anlamanız gereken iki anahtar şey var.
İlk olarak, MATLAB (ve Fortran, ancak C ve diğer programlama dillerinin çoğunda değil) dizileri "sütun ana düzeninde" bellekte depolar. örneğin A 2'den 3'e 10 matris ise, girişler sırayla bellekte depolanır
Bir (1,1,1)
Bir (2,1,1)
Bir (1,2,1)
Bir (2,2,1)
Bir (1,3,1)
Bir (2,3,1)
Bir (1,1,2)
Bir (2,1,2)
...
A (2,3,10)
Sütun ana düzeninin bu seçimi keyfidir - kolayca bir "satır büyük düzen" kuralı benimseyebiliriz ve aslında C ve diğer bazı programlama dillerinde yapılan budur.
Anlamanız gereken ikinci önemli şey, modern işlemcilerin belleğe tek seferde erişmemesi, daha ziyade 64 veya 128 bitişik baytlık (8 veya 16 çift kesinlikli kayar nokta sayısı) "önbellek hatlarını" yükleyip depolamasıdır. bir anda hafızadan. Bu veri parçaları geçici olarak hızlı bir bellek önbelleğinde saklanır ve gerektiğinde geri yazılır. (Uygulamada, önbellek mimarisi artık 3 veya 4 düzey önbellek seviyesi ile oldukça karmaşıktır, ancak temel fikir, bilgisayarların daha genç günlerimde sahip olduğu tek düzey bir önbellekle açıklanabilir.)
A
Döngüler, en içteki döngü satır altyazısını güncelleyecek şekilde iç içe yerleştirilmişse, dizi girişlerine A (1,1), A (2,1), A (3,1), ... sırasıyla erişilir. ilk A girişine (1,1) erişildiğinde, sistem ana bellekten önbelleğe A (1,1), A (2,1), ..., A (8,1) içeren bir önbellek satırı getirecektir. . En içteki döngünün sonraki 8 yinelemesi, ek ana bellek aktarımı olmadan bu veriler üzerinde çalışır.
Alternatif olarak, ilmekleri sütun indeksi en içteki döngüde değişecek şekilde yapılandırırsak, A girişlerine A (1,1), A (1,2), A (1,3) şeklinde erişilirdi ), ... Bu durumda, ilk erişim ana bellekten önbelleğe A (1,1), A (2,1), ..., A (8,1) getirir, ancak 7/8 bu girişler kullanılmaz. İkinci iterasyonda A (1,2) 'ye erişim daha sonra ana bellekten 8 giriş daha getirecektir, vb. Kod, matrisin 2. satırında çalışmaya başladığında, A (2,1) girişi, diğer gerekli verilere yol açmak için önbellekten temizlenebilir. Sonuç olarak, kod gerektiği kadar 8 kat daha fazla trafik üretiyor.
Bazı iyileştirme derleyicileri, bu sorunu önlemek için döngüleri otomatik olarak yeniden yapılandırabilir.
Matris çarpımı ve çarpanlarına ayırma için birçok sayısal doğrusal cebir algoritması, programlama diline bağlı olarak satır-büyük veya sütun-büyük sıralama düzeni ile verimli çalışacak şekilde optimize edilebilir. Bunu yanlış yapmak performans üzerinde önemli bir olumsuz etki yaratabilir.
For
MATLAB'da döngüler çok yavaş. Mümkün olduğunca MATLAB'da açık döngülerden kaçınmalısınız. Bunun yerine, genellikle bir problem matris / vektör işlemleri açısından ifade edilebilir. MATLABic yolu budur. Matrisleri başlatmak için birçok yerleşik işlev de vardır. Örneğin , bir matrisin tüm öğelerini 1'e (uzantısıyla, çarpma ile herhangi bir değere (skaler ) ayarlayacak olan bir işlevler () vardır. hepsi matris ile çarpılır)). Ayrıca 3 boyutlu dizilerde de çalışır (bence buradaki örneği kapsar).