ตารางแฮชใน MATLAB


92

MATLAB รองรับตารางแฮชหรือไม่


พื้นหลังบางส่วน

ฉันกำลังแก้ไขปัญหาใน Matlab ที่ต้องใช้การแสดงสเกล - สเปซของรูปภาพ ในการทำเช่นนี้ฉันสร้างตัวกรอง Gaussian 2 มิติที่มีความแปรปรวนsigma*s^kสำหรับkในบางช่วงจากนั้นฉันใช้แต่ละตัวกรองเพื่อกรองภาพ ตอนนี้ฉันต้องการการแมปบางประเภทจากkภาพที่กรองแล้ว

ถ้าkเป็นจำนวนเต็มเสมอฉันจะสร้างอาร์เรย์ 3 มิติดังต่อไปนี้

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

อย่างไรก็ตามkไม่จำเป็นต้องเป็นจำนวนเต็มดังนั้นฉันจึงไม่สามารถทำได้ สิ่งที่ฉันคิดจะทำคือการรักษาอาร์เรย์ของkสิ่งที่:

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

ซึ่งดูเหมือนจะดีในตอนแรกความคิดยกเว้นว่าฉันจะทำการค้นหานี้หลายพันครั้งโดยมีค่าประมาณ 20 หรือ 30 ค่าkและฉันกลัวว่าสิ่งนี้จะกระทบต่อประสิทธิภาพ

ฉันสงสัยว่าฉันจะไม่ได้รับการบริการที่ดีกว่าในการทำสิ่งนี้ด้วยตารางแฮชบางประเภทเพื่อที่ฉันจะได้มีเวลาค้นหาที่เป็น O (1) แทนที่จะเป็น O (n)


ตอนนี้ฉันรู้ว่าฉันไม่ควรปรับให้เหมาะสมก่อนเวลาอันควรและฉันอาจไม่มีปัญหานี้เลย แต่อย่าลืมว่านี่เป็นเพียงพื้นหลังและอาจมีบางกรณีที่นี่เป็นทางออกที่ดีที่สุดไม่ว่าจะเป็น ทางออกที่ดีที่สุดสำหรับปัญหาของฉัน

คำตอบ:


14

Matlab ไม่รองรับแฮชแท็ก แก้ไขจนถึง r2010a นั่นคือ; ดูคำตอบของ@Amro

เพื่อเพิ่มความเร็วของคุณดูอัพคุณสามารถวางfindและใช้INDEXING ตรรกะ

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

หรือ

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

อย่างไรก็ตามจากประสบการณ์ทั้งหมดของฉันกับ Matlab ฉันไม่เคยพบว่ามีปัญหาคอขวด


เพื่อเร่งแก้ปัญหาเฉพาะของคุณฉันขอแนะนำให้ใช้การกรองแบบเพิ่มหน่วย

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

สมมติว่าarray_of_ksเรียงลำดับจากน้อยไปมากและ GaussFilter จะคำนวณขนาดตัวกรองตามความแปรปรวน (และการใช้ตัวกรอง 1D 2 ตัว) หรือคุณสามารถกรองใน Fourier Space ซึ่งเป็นประโยชน์อย่างยิ่งสำหรับภาพขนาดใหญ่และหากความแปรปรวนเป็น เว้นระยะเท่า ๆ กัน (ซึ่งมักจะไม่น่าเสียดาย)


120

พิจารณาใช้แผนที่ระดับของ MATLAB: containers.Map นี่คือภาพรวมคร่าวๆ:

  • การสร้าง:

    >> 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
    
  • ค้นหา:

    x = rainfallMap('Jan');
    
  • กำหนด:

    rainfallMap('Jan') = 0;
    
  • เพิ่ม:

    rainfallMap('Total') = 999;
    
  • ลบ:

    rainfallMap.remove('Total')
    
  • ตรวจสอบ:

    values = rainfallMap.values;
    keys = rainfallMap.keys;
    sz = rainfallMap.size;
    
  • ตรวจสอบที่สำคัญ:

    if rainfallMap.isKey('Today')
        ...
    end
    

7
ว้าวฉันไม่รู้! +1. คุณรู้หรือไม่ว่ามันเร็วกว่าการจัดทำดัชนีเชิงตรรกะมาก?
Jonas

3
Containers.Map ถูกเพิ่มเข้ามาใน MATLAB 7.7 (R2008b) ดูmathworks.com/access/helpdesk/help/techdoc/rn/brqyzax-1.html ใหม่ใน R2010a เป็นตัวสร้างเพื่อระบุประเภทคีย์และประเภทค่า M = container.Map ('KeyType', kType, 'ValueType', vType)
zellus

@Jonas: ฉันไม่ได้ใช้มันอย่างกว้างขวางมันน่าสนใจที่จะเห็นว่าพวกเขาเปรียบเทียบกับการใช้ดัชนีเชิงตรรกะสำหรับการค้นหาอย่างไร ..
Amro

9
@ zellus, @ amro: มันน่ารำคาญไหมที่ไม่มีประวัติของคำสั่งใน Matlab?
Jonas

4
ค้นหา: rainMap ('ม.ค. '); กำหนด: RainMap ('ม.ค. ') = 'ศูนย์'; ตรวจสอบ: RainMap.values; RainMap.keys; RainMap.size; ตรวจสอบคีย์: RainMap.isKey ('วันนี้');
Evgeni Sergeev

26

คอนเทนเนอร์ใหม่ของ Matlab R2008b (7.7) คลาสของแผนที่เป็นเวอร์ชัน Matlab ที่ลดขนาดลงของอินเทอร์เฟซjava.util.Map มันมีประโยชน์เพิ่มของการเชื่อมต่อระบบกับทุกประเภท Matlab ( Java แผนที่ไม่สามารถจัดการ structs Matlabตัวอย่าง) รวมทั้งความสามารถตั้งแต่ Matlab 7.10 (R2010a) เพื่อระบุชนิดข้อมูล

การใช้งาน Matlab ที่จริงจังซึ่งต้องใช้แผนที่ / พจนานุกรมคีย์ - ค่าควรยังคงใช้คลาส Map ของ Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMapหรือHashtable ) เพื่อเข้าถึงฟังก์ชันการทำงานที่ใหญ่ขึ้นหากไม่มีประสิทธิภาพ Matlab เวอร์ชันก่อนหน้า R2008b ไม่มีทางเลือกอื่นที่แท้จริงไม่ว่าในกรณีใด ๆ และต้องใช้คลาส Java

ข้อ จำกัด ที่เป็นไปได้ของการใช้ Java Collections คือไม่สามารถมีประเภท Matlab ที่ไม่ใช่แบบดั้งเดิมเช่นโครงสร้าง ในการเอาชนะสิ่งนี้ให้ทำการแปลงประเภทลง (เช่นใช้ struct2cell หรือทางโปรแกรม) หรือสร้างออบเจ็กต์ Java แยกต่างหากที่จะเก็บข้อมูลของคุณและเก็บอ็อบเจ็กต์นี้ไว้ใน Java Collection

นอกจากนี้คุณอาจจะสนใจที่จะตรวจสอบบริสุทธิ์ Matlab เชิงวัตถุ (ชั้น-based) การดำเนินงาน Hashtable ซึ่งเป็นที่มีอยู่ในแฟ้มแลกเปลี่ยน


1
การใช้งานตามคลาส Matlab อื่นที่โพสต์ในวันนี้: mathworks.com/matlabcentral/fileexchange/28586
Yair Altman

19

คุณสามารถใช้ java ได้

ใน matlab:

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

แต่คุณจะต้องทำโปรไฟล์เพื่อดูว่ามันให้ความเร็วที่เพิ่มขึ้นหรือไม่ฉันเดา ...


12

มันค่อนข้างลึกลับ แต่ฉันแปลกใจที่ไม่มีใครแนะนำให้ใช้โครงสร้าง คุณสามารถเข้าถึงฟิลด์โครงสร้างใด ๆ โดยใช้ชื่อตัวแปรว่าสามารถเป็นตัวแปรได้struct.(var)ที่ไหนvarและจะแก้ไขอย่างเหมาะสม

dict.a = 1;
dict.b = 2;

var = 'a';

display( dict.(var) ); % prints 1

1
มันจะพังถ้าคุณใช้ตัวเลขเป็นฟิลด์ชื่อdict.('2') : mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…
Amro

นอกจากนี้ตัวแปรต้องเป็นจำนวนเต็ม: ใช้dict.(['k',num2str(1)])งานได้ แต่dict.(['k',num2str(1.1)])ล้มเหลวและหากค่าเป็นจำนวนเต็มคุณสามารถใช้เพื่อจัดทำดัชนีได้โดยตรง เป็นความคิดที่ดีอย่างอื่น
Jonas

@Amro, @Jonas จุดที่ยุติธรรมถ้าคีย์เป็นจำนวนเต็มคุณไม่จำเป็นต้องใช้เคล็ดลับนี้ (อาร์เรย์จะสมเหตุสมผลกว่า) ... ถ้าคีย์ลอยตามอำเภอใจนี่จะท้าทายกว่าเล็กน้อย แต่ฉัน 'd นำหน้าด้วยตัวอักษรและแทนที่.ด้วย_.
Mark Elliot

6
ปัญหาข้างต้นเกี่ยวกับการใช้โครงสร้างสามารถหลีกเลี่ยงได้โดยการแปรสตริงก่อนที่จะเพิ่มเป็นชื่อฟิลด์:dict.(genvarname(['k',num2str(1.1)]))
foglerit

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.