2010-02-11 45 views
6

İki dize anahtarıyla indekslenen bir sayı matrisini saklamanız gereken bir proje üzerinde çalışıyorum. Matris pürüzlü değildir, yani herhangi bir satır için bir sütun anahtarı varsa, tüm satırlar için mevcut olmalıdır. Benzer şekilde, herhangi bir sütun için bir satır anahtarı varsa, tüm sütunlar için mevcut olmalıdır.İlişkisel Matrisler?

Bunu ifade etmenin açık yolu ilişkilendirici bir dizi ilişkilendirici diziyle ilgilidir, ancak bu hem beceriksiz hem de verimsizdir ve pürüzlü olmayan özellik özelliğini zorlamaz. Herhangi bir popüler programlama dili, dile veya standart kitaplıklarının bir parçası olarak yerleşik bir ilişkisel matris sağlar mı? Öyleyse, hem API hem de uygulama düzeyinde nasıl çalışırlar? Bu proje için Python ve D kullanıyorum, ancak diğer dillerdeki örnekler yine de kullanışlı olacaktı çünkü API'ya bakıp Python veya D'de benzer bir şeyi uygulamanın en iyi yolunu bulabileceğim için.

cevap

2

Neden sadece standart bir matris kullanmakla kalmaz, aynı zamanda iki sözlükleri de vardır - bu, satır anahtarlarının satır indekslerine dönüştürülmesini ve sütun tuşlarının sütun indekslerine dönüştürülmesini sağlar. Oldukça kolay bir şekilde bu şekilde çalışacak kendi yapınızı yapılandırabilirsiniz. Matrisi ve iki sözlükleri içeren bir sınıf oluştur ve oradan git.

Python
0

yapabildin senin için anlamı "non-jaggedness zorlamak" emin değilim mesela iki dizeleri bir demet tarafından dizine bir dicti,

>>> d = {} 
>>> d["foo","bar"] = 10 
>>> d 
{('foo', 'bar'): 10} 

var, ama bir defaultdict kullanabilirsiniz ya açıkça set edilmemiş girişler için varsayılan bir değer döndürmek veya bilinen bir değer ile dicti sıfırlanır:

>>> xkeys = "abcdef" 
>>> ykeys = "xyz" 
>>> d = dict(((x,y), 0) for x in xkeys for y in ykeys) 
>>> d 
{('b', 'y'): 0, ('a', 'z'): 0, ('b', 'x'): 0, ('e', 'y'): 0, ('a', 'x'): 0, ('f', 'z'): 0, ('a', 'y'): 0, ('f', 'y'): 0, ('d', 'y'): 0, ('f', 'x'): 0, ('d', 'x'): 0, ('e', 'x'): 0, ('e', 'z'): 0, ('c', 'x'): 0, ('d', 'z'): 0, ('c', 'y'): 0, ('c', 'z'): 0, ('b', 'z'): 0} 

bilinen bir sette sadece tuşları sonra ben dicti sınıflara önermek izin verildiğini zorlamak istiyorsanız doğrulama ekleyin. Python için larry modülünün yakın zamanda yayımlandığı

+0

Evet, Python'u pek iyi bilmiyorum. Bunu yapabildiğinizin farkında değildim, ancak temel olarak tupleleri bir anahtar olarak kullandığınız göz önünde bulundurulduğunda mantıklı. – dsimcha

+0

Bu harika çalışıyor, ama istemediğiniz şeyin bir parçası olduğunu düşündüğüm anahtarları saklamak için daha fazla bellek kullanacaktır. Bununla birlikte, matrise erişmeden önce matris indekslerini bulmak için karma tablo aramaları gerektiren önerilen yöntemden biraz daha hızlı olmalıdır. Hız veya uzay: soru bu. –

+0

@Justin: Bu güzel bir fikir, ama daha iyi bir cevap bekliyorum. İdeal olarak, tek bir sütun için tüm satırları veya yalnızca bir geçici çözüm için değil, tek bir satır için tüm sütunları alabileceğim "gerçek" bir matris istiyorum. – dsimcha

0

. İstediğinizi yaptığına inanıyorum.