MATLAB'da karma tablolar


92

MATLAB'ın karma tablolar için herhangi bir desteği var mı?


Biraz geçmiş

Matlab'da bir görüntünün ölçek-uzay gösterimini gerektiren bir sorun üzerinde çalışıyorum. Bunu yapmak sigma*s^kiçin k, bir aralıkta varyansı olan 2 boyutlu bir Gauss filtresi oluşturuyorum ve ardından her birini sırayla görüntüyü filtrelemek için kullanıyorum. Şimdi, kfiltrelenmiş görüntüden bir tür eşleştirme istiyorum .

Her kzaman bir tamsayı olsaydı, şöyle bir 3B dizi oluştururdum:

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

Ancak, kmutlaka bir tam sayı değildir, bu yüzden bunu yapamam. Yapmayı düşündüğüm şey, şöyle bir dizi tutmaktı k:

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

Bu ilk bakışta oldukça iyi görünüyor, ancak bu aramayı potansiyel olarak birkaç bin kez yaklaşık 20 veya 30 değerle kyapacağım ve bunun performansa zarar vereceğinden korkuyorum.

Bunu bir tür hash tablosu ile yapmamın daha iyi olup olmayacağını merak ediyorum, böylece O (n) yerine O (1) olan bir arama süresine sahip olurdum.


Şimdi, erken optimizasyon yapmamam gerektiğini biliyorum ve bu sorunu hiç yaşamamış olabilirim, ancak unutmayın, bu sadece arka plan ve bunun gerçekten en iyi çözüm olduğu durumlar olabilir. için en iyi çözüm benim problem.

Yanıtlar:


14

Matlab hashtable'ları desteklemiyor. DÜZENLE r2010a'ya kadar, yani; @Amro'nun cevabına bakınız .

Taramalarınızı hızlandırmak için find, simgesini bırakabilir ve MANTIK İNDEKSLEME kullanabilirsiniz .

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

veya

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

Ancak, Matlab ile olan tüm deneyimlerime göre, hiçbir zaman bir darboğaz aramadım.


Sorununuzu hızlandırmak için, artımlı filtreleme kullanmanızı öneririm.

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

varsayımın array_of_ksartan sırada sıralandığını ve GaussFilter'ın varyansa göre filtre maskesi boyutunu hesapladığını (ve elbette 2 1D filtreleri kullandığını) veya Fourier Space'te filtreleyebilirsiniz, bu özellikle büyük görüntüler için ve varyanslar eşit aralıklarla yerleştirilmiştir (ki büyük olasılıkla maalesef değildir)


120

MATLAB'ın harita sınıfını kullanmayı düşünün: container.Map . İşte kısa bir genel bakış:

  • Oluşturma:

    >> 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
    
  • Yukarı Bak:

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

    rainfallMap('Jan') = 0;
    
  • Ekle:

    rainfallMap('Total') = 999;
    
  • Kaldırmak:

    rainfallMap.remove('Total')
    
  • İnceleyin:

    values = rainfallMap.values;
    keys = rainfallMap.keys;
    sz = rainfallMap.size;
    
  • Kontrol anahtarı:

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

7
Vay canına, bunu bilmiyordum! +1. Mantıksal indekslemeden çok daha hızlı olup olmadıklarını biliyor musunuz?
Jonas

3
Container.Map, MATLAB 7.7 (R2008b) 'e eklendi, bkz. Mathworks.com/access/helpdesk/help/techdoc/rn/brqyzax-1.html . R2010a'daki yenilik, anahtar tipinin yanı sıra değer tipini belirleyen bir yapıcıdır. M = container'lar.Map ('KeyType', kType, 'ValueType', vType)
zellus

@Jonas: Bunları kapsamlı bir şekilde kullanmadım, arama için mantıksal indekslemeyle nasıl karşılaştırıldıklarını görmek ilginç olurdu ..
Amro

9
@ zellus, @ amro: Matlab'da komutların geçmişinin olmaması can sıkıcı değil mi?
Jonas

4
Arama: rainfallMap ('Jan'); Atayın: rainfallMap ('Ocak') = 'sıfır'; İnceleyin: rainfallMap.values; rainfallMap.keys; rainfallMap.size; Kontrol anahtarı: rainfallMap.isKey ('Bugün');
Evgeni Sergeev

26

Matlab R2008b (7.7) 'nin yeni container.Map sınıfı, java.util.Map arayüzünün küçültülmüş bir Matlab sürümüdür . Tüm Matlab türleriyle (örneğin Java Haritaları Matlab yapılarını işleyemez) sorunsuz entegrasyonun yanı sıra, Matlab 7.10'dan (R2010a) beri veri türlerini belirleme becerisine sahiptir .

Anahtar-değer haritalarını / sözlüklerini gerektiren ciddi Matlab uygulamaları , performans değilse de daha büyük işlevlerine erişmek için Java'nın Harita sınıflarını ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap veya Hashtable ) kullanmalıdır. R2008b'den önceki Matlab sürümlerinin hiçbir durumda gerçek bir alternatifi yoktur ve Java sınıflarını kullanmalıdır.

Java Koleksiyonları kullanmanın olası bir sınırlaması, yapılar gibi ilkel olmayan Matlab türlerini içerememesidir. Bunun üstesinden gelmek için, türleri alt dönüştürün (ör. Struct2cell kullanarak veya programlı olarak) veya bilgilerinizi tutacak ve bu nesneyi Java Koleksiyonunda depolayacak ayrı bir Java nesnesi oluşturun.

Dosya Değişiminde bulunan saf Matlab nesnesine yönelik (sınıf tabanlı) Hashtable uygulamasını incelemek de ilginizi çekebilir .


1
Bugün yayınlanan başka bir Matlab sınıfı tabanlı uygulama: mathworks.com/matlabcentral/fileexchange/28586
Yair Altman

19

Bunun için java kullanabilirsin.

Matlab'da:

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

Ama sanırım size hız kazancı sağlayıp sağlamadığını görmek için biraz profilleme yapmanız gerekecek ...


12

Biraz kafa karıştırıcı ama kimsenin yapıların kullanılmasını önermemesine şaşırdım. Herhangi bir yapı alanına değişken adına göre erişebilirsiniz, struct.(var)nerede varherhangi bir değişken olabilir ve uygun şekilde çözülür.

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

var = 'a';

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

1
Alan adı olarak bir sayı kullanırsanız kırılır dict.('2'):: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…
Amro

Ayrıca, değişkenlerin tamsayı olması gerekir: dict.(['k',num2str(1)])çalışır, ancak dict.(['k',num2str(1.1)])başarısız olur ve değerler tam sayı ise, bunları doğrudan indekslemek için kullanabilirsiniz. Aksi takdirde güzel bir fikir.
Jonas

@Amro, @Jonas, adil puanlar, eğer anahtarlar tamsayı olsaydı, bu numarayı kullanman gerekmezdi (bir dizi daha mantıklı olurdu) ... eğer anahtarlar keyfi yüzer ise bu biraz daha zorlayıcı, ama ben 'd önekini bir harfle ve yerine .bir _.
Mark Elliot

6
Yapıların kullanımıyla ilgili yukarıdaki sorunlar, alan adları olarak eklemeden önce dizeleri değişkenleştirerek önlenebilir:dict.(genvarname(['k',num2str(1.1)]))
foglerit

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.