Fungsi matematika apa yang dilakukan reshape?

Baik di Python maupun MATLAB Anda bisa menggunakan fungsi bernama reshape() untuk mengubah dimensi matriks.

Operasi apa yang dilakukan dalam aljabar linier, apakah ini perubahan basis, atau perkalian matriks yang lebih sederhana, atau bukan keduanya?


person Steven Alsheimer    schedule 08.04.2019    source sumber
comment
Pernahkah Anda melihat contoh di dokumentasi reshape (MATLAB)?   -  person SecretAgentMan    schedule 08.04.2019


Jawaban (3)


Fungsi ini tidak ada hubungannya dengan aljabar linier, ini adalah trik pengindeksan sederhana. Pertimbangkan yang berikut (Saya akan menggunakan sintaks MATLAB, tetapi dengan Python, khususnya menggunakan NumPy/SciPy, itu akan berfungsi sama):

A = [1 2 3; 4 5 6]; % 2-by-3 matrix
B = reshape(A,3,2); % B is 3-by-2
B =
     1     5
     4     3
     2     6

Jadi sebenarnya Anda memiliki 6 indeks di A: 1 hingga 6, dalam urutan kolom utama. Saat dibentuk ulang, gaya linier dipertahankan, hanya disusun ulang. Secara linier, elemen Anda, dalam urutan menaik: 1 4 2 5 3 6, yang disimpan dalam memori yang berdekatan. Semacam 'header' memberi tahu program bagaimana elemen-elemen yang berdekatan ini dibentuk. Inilah sebabnya mengapa reshape hampir gratis: hanya mengubah header.

Aljabar linier tidak ada hubungannya dengan ini, ini hanya trik numerik untuk mempermudah tugas pemrograman tertentu.

Untuk informasi lebih lanjut tentang cara kerja pengindeksan di MATLAB, saya merekomendasikan Tanya Jawab yang bagus ini.

Di balik terpal MATLAB mengonversi A(2,2) menjadi A(4), yaitu indeks linier keempat, menggunakan sub2ind(), justru karena semuanya disimpan sebagai vektor linier. Yang dilakukan reshaping hanyalah memberi tahu header bahwa elemen 3 tidak lagi berada di A(1,2), tetapi diubah menjadi A(3,1) karena tampilannya berubah.

person Adriaan    schedule 08.04.2019
comment
Ada referensi? Apa yang Anda tunjukkan hanyalah transpos sederhana. Saya tidak yakin apakah dalam bentuk ulang yang lebih rumit akan sama. - person Karls; 08.04.2019
comment
@Karls cukup masukkan ini ke MATLAB, transpos A akan menjadi [1 4; 2 5; 3 6], yang merupakan matriks berbeda dari matriks yang dialihkan. Transposisi mengubah urutan elemen, oleh karena itu lebih mahal daripada pembentukan ulang sederhana - person Adriaan; 08.04.2019
comment
Oke, benar, ini tidak setara dengan transpos. Saya masih berpikir ini mungkin lebih rumit dari sekedar header. Apakah Anda mempunyai referensi yang dapat mendukung penjelasan Anda? - person Karls; 08.04.2019
comment
@Karls: Referensinya adalah dokumentasi ke reshape, yang ditautkan Adriaan, serta halaman dokumentasi lainnya ini. - person Cris Luengo; 09.04.2019
comment
Anda dapat membuat array yang sangat besar, dan menentukan berapa lama waktu yang diperlukan untuk melakukan pembentukan ulang dan berapa lama waktu yang diperlukan untuk melakukan transposisi. Anda akan melihat bahwa reshape itu sepele, tidak ada data yang disalin, dan transposisi memerlukan waktu yang tidak sepele, ia memang menyalin data. - person Cris Luengo; 09.04.2019

Menurut dokumentasi python 1,2, itu hanya mengacaukan array (sehingga menjadikan t vektor 1-D linier. Kemudian, dengan menggunakan pengindeksan, ia dikembalikan ke array baru dengan ukuran yang ditentukan. Misalnya:

start_array = 
[1,2,3,4;
5,6,7,8;
9,10,11,12]

i_a = [1,2,3,4,5,6,7,8,9,10,11,12] %implicit, not visible for user

result_array = 
[i_a(1), i_a(6), i_a(11); 
i_a(5), i_a(10), i_a(4); 
i_a(9), i_a(3), i_a(8); 
i_a(2), i_a(7), i_a(12)]
person Karls    schedule 08.04.2019
comment
Anda sekarang menganggap elemen Anda sebagai baris-mayor; sebenarnya tidak, melainkan disimpan (setidaknya dalam MATLAB, sintaksis yang Anda gunakan) dalam urutan kolom utama. - person Adriaan; 08.04.2019
comment
Urutan baris atau kolom tidak relevan di sini, ini hanya menampilkan konsep. Saya mendasarkannya pada dokumentasi resmi Python SciPy, di MATLAB bisa dilakukan dengan cara lain. - person Karls; 08.04.2019
comment
di bawah tenda, array numpy seperti MATLAB, 1D, selalu. Itu hanya mengubah cara menerjemahkan indeks 2D (dalam hal ini) ke dalam array 1D, dan cara menampilkannya. - person Ander Biguri; 09.04.2019
comment
Kutipan dari dokumentasi You can think of reshaping as first raveling the array [...] then inserting [...] using the same kind of index. Jadi jika mereka asli disimpan secara linier, itu terdengar seperti hal yang remeh. - person Karls; 09.04.2019

Matriks paling sederhana yang dapat Anda bentuk ulang adalah 2x2, namun Anda pasti mengerti maksudnya. (Maaf, StackOverflow tidak mengizinkan saya menyisipkan gambar atau LaTex, jadi, Anda harus sedikit menderita untuk membaca ini.)

Kita mulai dengan A=[[a,b],[c,d]] dan kita ingin membentuknya kembali menjadi array 1x4: [[a,b,c,d]]. Anda dapat melakukannya secara aljabar:

[[1,0]] * A * [[1,0,0,0],[0,0,0,0]] + 
[[1,0]] * A * [[0,0,0,0],[0,1,0,0]] + 
[[0,1]] * A * [[0,0,1,0],[0,0,0,0]] + 
[[0,1]] * A * [[0,0,0,0],[0,0,0,1]]

* menunjukkan perkalian matriks.

Setiap suku merupakan hasil kali matriks konformabel: 1x2 * 2x2 * 2x4 yang menghasilkan hasil bentuk 1x4.

Suku pertama menghasilkan [[a,0,0,0]], suku ke-2 [[0,b,0,0]], suku ke-3 [[0,0,c,0]], dan suku ke-4 [[0,0,0,d]].

Menggeneralisasikannya ke bentuk A nxm yang sewenang-wenang seharusnya tidak terlalu sulit. Anda memerlukan n*m suku, bukan 4, karena matriks Anda yang telah diubah bentuknya akan menjadi 1x(n*m). Setiap suku harus selaras, jadi, Anda memerlukan matriks berbentuk 1xn untuk menentukan A dari kiri, dan matriks berbentuk mx(n*m) untuk menentukan A dari kanan.

Jika Anda perlu membentuk kembali bentuk A nxm menjadi bentuk kxl, di mana k*l=n*m, Anda perlu menekan A dari kiri dengan matriks kxn dan dari kanan dengan matriks mx(k*l).

person gc1o1    schedule 21.04.2021