Jawaban yang agak lebih panjang yang menjelaskan mengapa lebih kiri memiliki indeks paling kiri bervariasi paling cepat. Ada dua hal utama yang perlu Anda pahami.
Pertama, MATLAB (dan Fortran, tetapi tidak C dan sebagian besar bahasa pemrograman lainnya) menyimpan array dalam memori dalam "urutan utama kolom." misalnya jika A adalah matriks 2 kali 3 kali 10, maka entri akan disimpan dalam memori dalam urutan
A (1,1,1)
A (2,1,1)
A (1,2,1)
A (2,2,1)
A (1,3,1)
A (2,3,1)
A (1,1,2)
A (2,1,2)
...
A (2,3,10)
Pilihan urutan utama kolom ini sewenang-wenang - kita dapat dengan mudah mengadopsi konvensi "urutan utama", dan pada kenyataannya itulah yang dilakukan dalam C dan beberapa bahasa pemrograman lainnya.
Hal penting kedua yang perlu Anda pahami adalah bahwa prosesor modern tidak mengakses memori satu lokasi pada suatu waktu, melainkan memuat dan menyimpan "garis cache" dari 64 atau bahkan 128 byte yang berdekatan (8 atau 16 angka floating point presisi ganda) pada suatu waktu dari memori. Potongan data ini disimpan sementara dalam cache memori cepat dan ditulis kembali sesuai kebutuhan. (Dalam praktiknya arsitektur cache sekarang cukup rumit dengan sebanyak 3 atau 4 level memori cache, tetapi ide dasarnya dapat dijelaskan dengan cache satu tingkat dari jenis yang dimiliki komputer di masa muda saya.)
SEBUAH
Jika loop bersarang sehingga loop paling dalam memperbarui subscript baris, maka entri array akan diakses dalam urutan A (1,1), A (2,1), A (3,1), ... Ketika entri pertama A (1,1) diakses, sistem akan membawa garis cache yang mengandung A (1,1), A (2,1), ..., A (8,1) ke dalam cache dari memori utama . 8 iterasi berikutnya dari loop terdalam bekerja pada data ini tanpa transfer memori utama tambahan.
Jika dalam alternatif, kita menyusun loop sehingga indeks kolom bervariasi dalam loop paling dalam, maka entri A akan diakses dalam urutan A (1,1), A (1,2), A (1,3 ), ... Dalam hal ini, akses pertama akan membawa A (1,1), A (2,1), ..., A (8,1) ke dalam cache dari memori utama, tetapi 7/8 dari entri ini tidak akan digunakan. Akses ke A (1,2) dalam iterasi kedua kemudian akan membawa 8 entri lainnya dari memori utama, dan seterusnya. Pada saat kode mulai bekerja pada baris 2 dari matriks, entri A (2,1) mungkin dihapus dari cache untuk memberi jalan bagi data lain yang diperlukan. Akibatnya, kode ini menghasilkan lalu lintas 8 kali lebih banyak dari yang diperlukan.
Beberapa kompiler yang mengoptimalkan mampu merestrukturisasi loop secara otomatis untuk menghindari masalah ini.
Banyak algoritma aljabar linear numerik untuk perkalian dan faktorisasi matriks dapat dioptimalkan untuk bekerja secara efisien dengan skema pengurutan baris-mayor atau kolom-mayor tergantung pada bahasa pemrograman. Melakukan ini dengan cara yang salah dapat memiliki dampak negatif yang signifikan terhadap kinerja.
For
loop sangat lambat di MATLAB. Anda harus menghindari loop eksplisit di MATLAB bila memungkinkan. Sebaliknya, biasanya masalah dapat dinyatakan dalam operasi matriks / vektor. Itu adalah cara MATLABic. Ada juga banyak fungsi bawaan untuk menginisialisasi matriks, dll. Misalnya, ada fungsi, ones () , yang akan mengatur semua elemen matriks ke 1 (dengan ekstensi, ke nilai apa pun dengan perkalian (skalar) dikalikan dengan semua-yang matriks)). Ini juga berfungsi pada array 3-D (yang menurut saya mencakup contoh di sini).