„Hash“ lentelės „MATLAB“

Ar MATLAB palaiko maišos lenteles?


Kai kurie fonai

Dirbu su „Matlab“ problema, kuriai reikalingas mastelio keitimas. Norėdami tai padaryti, aš sukuriu dviejų dimensijų Gauso filtrą, kurio variacija sigma*s^k yra k tam tikrame diapazone. Dabar aš noriu, kad kartografavimas iš k į filtruotą vaizdą.

Jei k visada buvo sveikasis skaičius, tiesiog sukursiu 3D masyvą, kuris:

 arr[k] = <image filtered with k-th guassian> 

Tačiau k nebūtinai yra sveikas skaičius, todėl negaliu to padaryti. Ką aš maniau apie išsaugoti k masyvą, kad:

 arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian> 

Tai atrodo labai gerai iš pirmo žvilgsnio, išskyrus tai, kad galėsiu atlikti šią paiešką potencialiai kelis tūkstančius kartų su maždaug 20 ar 30 k vertėmis, ir aš bijau, kad tai pakenks našumui.

Įdomu, ar man būtų geriau tai padaryti su tam tikros rūšies maišos lentele, kad turiu paieškos laiką, kuris yra O (1), o ne O (n).


Dabar žinau, kad neturėčiau anksti optimizuoti, ir aš neturiu šios problemos, bet nepamirškite, kad tai tik fonas, ir gali būti kartų, kai tai tikrai geriausias sprendimas, neatsižvelgiant į tai, ar tai yra geriausias sprendimas mano problemų.

78
28 авг. nustatė Nathan Fellman 28 rug . 2010-08-28 21:32 '10, 21:32, 2010-08-28 21:32
@ 6 atsakymai

Matlab nepalaiko maišymo stalų. EDIT Dar ne r2010a; žr.

Norėdami pagreitinti paiešką, galite atkurti find ir naudoti LOGICAL INSTRUCTION .

 arr{array_of_ks==k} = <image filtered with k-th Gaussian> 

arba

 arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian> 

Vis dėlto per visą savo patirtį, susijusią su „Matlab“, aš niekada neturėjau problemų dėl kliūties.


Kad pagreitintumėte konkrečią problemą, siūlau naudoti arba papildomą filtravimą.

 arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1))) 

Darant prielaidą, kad array_of_ks rūšiuojama didėjančia tvarka, ir GaussFilter apskaičiuoja filtro kaukės dydį pagal dispersiją (ir, matyt, naudoja 2 1D filtrus), arba galite filtruoti „Fourier“ erdvėje, kuri yra ypač naudinga dideliems vaizdams, ir jei nukrypimai yra tolygiai paskirstomi (jie, tikriausiai, deja, nėra).

13
28 авг. Atsakyti Jonas 28 rug. 2010-08-28 21:59 '10, 21:59, 2010-08-28 21:59

Apsvarstykite galimybę naudoti MATLAB: container.Map žemėlapio klasę. Čia pateikiama greita apžvalga:

border=0
  • Kūrimas:

     >> keys = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', ... 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Annual'}; >> values = {327.2, 368.2, 197.6, 178.4, 100.0, 69.9, ... 32.3, 37.3, 19.0, 37.0, 73.2, 110.9, 1551.0}; >> rainfallMap = containers.Map(keys, values) rainfallMap = containers.Map handle Package: containers Properties: Count: 13 KeyType: 'char' ValueType: 'double' Methods, Events, Superclasses 
  • Paieška:

     x = rainfallMap('Jan'); 
  • Tikslas:

     rainfallMap('Jan') = 0; 
  • Pridėti

     rainfallMap('Total') = 999; 
  • Ištrinti

     rainfallMap.remove('Total') 
  • Patikrinkite:

     values = rainfallMap.values; keys = rainfallMap.keys; sz = rainfallMap.size; 
  • Tikrinimo raktas:

     if rainfallMap.isKey('Today') ... end 
113
28 авг. atsakymas duotas Amro 28 rug. 2010-08-28 22:04 '10, 10:04 PM 2010-08-28 22:04

Naujos talpyklos Matlab R2008b (7.7). Žemėlapio klasė yra mažesnė Matlab java.util.Map versija. Jis turi papildomą privalumą, kad būtų galima integruoti visus tipus „Matlab“ (pvz., „ Java“ kortelės negali apdoroti „Matlab“ struktūrų ), taip pat gebėjimas, nes „Matlab 7.10“ (R2010a) turi nurodyti duomenų tipus .

Sunkios „Matlab“ programos, reikalaujančios pagrindinių žemėlapių / žodynų, vis tiek turi naudoti „JavaScript“ žemėlapių klases ( java.util.EnumMap , „ HashMap“ , „ TreeMap“ , „ LinkedHashMap“ arba „ Hashtable“ ), kad galėtumėte pasiekti didesnį jų funkcionalumą, jei tai neįmanoma. Matlab variantai prieš R2008b neturi jokios realios alternatyvos ir turėtų naudoti „Java“ klases.

Galimas „Java“ kolekcijų naudojimo apribojimas yra jų nesugebėjimas turėti ne primityvių „Matlab“ tipų, pvz., Struktų. Norėdami tai išspręsti, sumažinkite tipo konversiją (pvz., Naudojant struktūrą2 arba programiniu būdu) arba sukurkite atskirą „Java“ objektą, kuris išsaugos jūsų informaciją ir saugos šį objektą „Java“ rinkinyje.

Galbūt jus taip pat domina ištirti „Hashtable“ objekto orientuotą (klasės) diegimą su „Pure-Matlab“, kuri yra „File Exchange“ .

24
29 авг. Atsakymas, kurį pateikė Yair Altman, rugpjūčio 29 d 2010-08-29 00:45 '10 - 0:45 2010-08-29 00:45

Jam galite naudoti java.

„Matlab“:

 dict = java.util.Hashtable; dict.put('a', 1); dict.put('b', 2); dict.put('c', 3); dict.get('b') 

Bet jums reikės atlikti profiliavimą, kad sužinotumėte, ar tai suteikia jums greitį, manau ...

16
28 авг. atsakymas duotas tauran 28 rug . 2010-08-28 22:01 '10, 10:01 PM 2010-08-28 22:01

Tai šiek tiek baisus, bet esu nustebęs, kad niekas nepasiūlė naudoti struktūrų. Galite pasiekti bet kurį struktūros lauką su kintamojo pavadinimu struct.(var) , kur var gali būti bet koks kintamasis ir bus atitinkamai išspręstas.

 dict.a = 1; dict.b = 2; var = 'a'; display( dict.(var) ); % prints 1 
11
28 авг. atsakymas, kurį pateikė Mark Elliot 28 rug. 2010-08-28 22:28 '10 10:28 val. 2010-08-28 22:28

Taip pat galite naudoti naują tipą „Table“. Galite saugoti įvairių tipų duomenis ir gauti statistiką iš to labai lengvai. Norėdami gauti daugiau informacijos, žr. Http://www.mathworks.com/help/matlab/tables.html .

1
14 нояб. Lei Zhang atsakymas 14 lapkričio. 2014-11-14 00:21 '14 ne 0:21 2014-11-14 00:21

Kiti klausimai apie „ žymes arba užduoti klausimą