Apakah MATLAB memiliki dukungan untuk tabel hash?
Beberapa latar belakang
Saya sedang mengerjakan masalah di Matlab yang membutuhkan representasi skala-ruang dari sebuah gambar. Untuk melakukan ini, saya membuat filter Gaussian 2-D dengan varians sigma*s^k
untuk k
beberapa rentang., Dan kemudian saya menggunakan masing-masing secara bergantian untuk memfilter gambar. Sekarang, saya ingin semacam pemetaan dari k
ke gambar yang difilter.
Jika k
selalu berupa integer, saya cukup membuat array 3D seperti itu:
arr[k] = <image filtered with k-th guassian>
Namun, k
belum tentu merupakan bilangan bulat, jadi saya tidak bisa melakukan ini. Apa yang saya pikirkan untuk dilakukan adalah menyimpan array k
seperti itu:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Yang tampaknya cukup bagus pada awalnya, kecuali saya akan melakukan pencarian ini secara potensial beberapa ribu kali dengan sekitar 20 atau 30 nilai k
, dan saya khawatir ini akan merusak kinerja.
Saya ingin tahu apakah saya tidak akan lebih baik melakukan ini dengan tabel hash semacam itu sehingga saya akan memiliki waktu pencarian yaitu O (1) daripada O (n).
Sekarang, saya tahu bahwa saya seharusnya tidak mengoptimalkan sebelum waktunya, dan saya mungkin tidak memiliki masalah ini sama sekali, tetapi ingat, ini hanya latar belakang, dan mungkin ada kasus di mana ini benar-benar solusi terbaik, terlepas dari apakah itu solusi terbaik untuk masalah saya .
Container.Map baru Matlab R2008b (7.7) class adalah versi Matlab yang diperkecil dari antarmuka java.util.Map . Ini memiliki manfaat tambahan dari integrasi tanpa batas dengan semua tipe Matlab ( Java Maps tidak dapat menangani struct Matlab misalnya) serta kemampuan sejak Matlab 7.10 (R2010a) untuk menentukan tipe data .
Implementasi Matlab serius yang membutuhkan peta / kamus nilai kunci tetap harus menggunakan kelas Peta Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap , atau Hashtable ) untuk mendapatkan akses ke fungsionalitas yang lebih besar jika bukan performa. Versi Matlab yang lebih lama dari R2008b tidak memiliki alternatif nyata dalam hal apa pun dan harus menggunakan kelas Java.
Batasan potensial dalam menggunakan Koleksi Java adalah ketidakmampuannya untuk memuat jenis Matlab non-primitif seperti struct. Untuk mengatasi hal ini, konversi tipe-tipe (mis., Menggunakan struct2cell atau secara terprogram), atau buat objek Java terpisah yang akan menyimpan informasi Anda dan menyimpan objek ini di Koleksi Java.
Anda mungkin juga tertarik untuk memeriksa implementasi Hashtable berorientasi objek (berbasis kelas) murni-Matlab, yang tersedia di File Exchange .
sumber
Anda bisa menggunakan java untuk itu.
Di matlab:
Tetapi Anda harus melakukan beberapa profil untuk melihat apakah itu memberi Anda peningkatan kecepatan, saya kira ...
sumber
Ini sedikit clugey, tapi saya terkejut tidak ada yang menyarankan menggunakan struct. Anda dapat mengakses bidang struct apa pun dengan nama variabel karena di
struct.(var)
manavar
dapat berupa variabel apa pun dan akan menyelesaikannya dengan tepat.sumber
dict.('2')
:: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…dict.(['k',num2str(1)])
berfungsi, tetapidict.(['k',num2str(1.1)])
gagal, dan jika nilainya adalah bilangan bulat, Anda dapat menggunakannya untuk mengindeks secara langsung. Sebaliknya itu ide yang bagus..
dengan_
.dict.(genvarname(['k',num2str(1.1)]))
Anda juga dapat memanfaatkan tipe baru "Tabel". Anda dapat menyimpan berbagai jenis data dan mendapatkan statistik darinya dengan sangat mudah. Lihat http://www.mathworks.com/help/matlab/tables.html untuk info lebih lanjut.
sumber