V
tamsayıların bir vektörü olsun ve L'un V
uzunluğunu olmasına izin verin.Düşük karmaşıklık tamsayı vektörlerinin verimli gösterimi
Şimdi, V
içinde farklı değerlerin sayısı Kdaha küçük daha L olduğunu varsayalım.
bir de N ardışık sürekli "blok" bir birleştirme şeklinde, böylece V
, kriteri olduğu kabul edilebilir.
Son olarak, bir V
bundan böyle salt okunur ( aka değişmez) 'dir, yani bir kez başlatıldı varsayabiliriz.
saklamak için savurganlıktır (şu anda çalışıyorum durumda, L olarak N 10 ile 10 ve yaklaşık 20 olduğu) standart MATLAB L uzun vektörü gibi düşük karmaşıklıktaki veriler. MATLAB herhangi yerleşik
- düzenli vektörü olarak aynı arayüze sahip veri yapısı (örneğin bir ifade
V(k)
ile olan son öğe ile k-inci elemanı okuyabilir var mıV(end)
,V(p:q)
ile konumların aralıkları, vb.). - , bir tam sayı büyüklüğünden L × 'dan daha az depolama alanı kullanır.
?
btw, sorun oldukça aynı (en azından AFAICT) seyrek dizi gösterimi edilene andırır, ancak.
Tamam, burada gariepy en yanıta göre benim çözüm, var:
block_sizes = [5, 4, 3, 2];
block_values = 1000 + (1:numel(block_sizes));
interpolation_table = [0 cumsum(block_sizes)];
V = @(i) interp1(interpolation_table, [NaN block_values], i, 'next');
V(0)
ans =
NaN
V(1:5)
ans =
1001 1001 1001 1001 1001
V(6:9)
ans =
1002 1002 1002 1002
V(10:12)
ans =
1003 1003 1003
V(13:14)
ans =
1004 1004
V(15)
ans =
NaN
olsa minik siğil vardır: bir yükseltilmiş eğer
V(end)
ans =
1001
(Daha iyi olurdu tamamen deli cevap vermek yerine argümanlar olarak
end
, verilen istisna.)
Tabii ki, her zaman böyle bir şeyin kendi uygulamamı gerçekleştirmeye çalışabileceğimi biliyorum, ancak bundan kaçınabilirse tekerlekleri yeniden icat etmemeyi tercih ederim.
Kısa cevap yok:
DÜZENLEME: Bu enterpolasyon fonksiyonu ile aralıkları yapmak CAN not. Bununla birlikte, bu vektörü nasıl kullandığınıza bağlı olarak, tüm vektörü hafızada saklamaksızın istediğiniz şeyi gerçekleştirmenin bir yolu olabilir. Bize örnek bir örnek verirseniz belki yardımcı olabiliriz. – Suever
@Suever: Şimdiden bir örnek verdim: * L * = 1 milyon, * N * = 20. Bunlar, problemin konusundaki tek parametrelerdir. – kjo
Doğru, ama hedefiniz sadece bu vektörü yaratıyor ya da vektörle * bir şeyler yapmaya çalışıyorsunuz. Sadece bunu oluşturmaksa, kendi uygulamanızı yuvarlamanız gerekecektir. Eğer bir şeyler yapmak istiyorsanız, o zaman yerleşik bir yol olabilir. – Suever