2011-08-01 11 views
6

Çok büyük bir 3D sayısal dizi skaler değerlerim var (eğer yapmanız gerekiyorsa OK "bir ses"). Düzgün bir skalar alanı üzerinde, düzensiz bir şekilde, bilinen tümleşik integral olmayan xyz koordinatlarının ardı ardına enterpolasyon yapmak istiyorum.Bir scipy interpolant gradyanı doğrudan nasıl elde edilir?

için bu

Şimdi scipy destek sadece mükemmel: I

filtered_volume = scipy.ndimage.interpolation.spline_filter(volume) 

ile ses filtre ve görünüşe göre iyi davrandığını elde etmek için ilgi (x, y, z) için

scipy.ndimage.interpolation.map_coordinates(
    filtered_volume, 
    [[z],[y],[x]], 
    prefilter=False) 

çağırmak (pürüzsüz vb) enterpolasyonlu değerler. Şimdiye kadar çok iyi. Bununla birlikte, başvurum da enterpolasyonlu alanın yerel türevlerine ihtiyaç duyuyor. Şu anda bunları merkezi-farklılaştırma ile elde ediyorum: Ayrıca hacmi 6 ek noktada (bu en azından map_coordinates'a sadece bir çağrı ile yapılabilir) ve örneğin (i(x+h,y,z)-i(x-h,y,z))/(2*h)'dan x türevini hesapladım. (Evet biliyorum 3 tane ek musluk sayısını azaltmak ve "tek taraflı" farklılıklar yapmak olabilir, ama asimetri beni rahatsız eder.)

Benim içgüdüm degrade elde etmek için daha doğrudan bir yol olmalı ancak Schati uygulamasının bağırsaklarında neyin devam ettiğini anlamak için yeterince spline matematik (henüz) bilmiyorum (0): scipy/scipy/ndimage/src/ni_interpolation.c.

Degradelerimi "daha doğrudan" merkezi farklılaştırmadan elde etmenin daha iyi bir yolu var mı? Tercihen, Scipy'nin gizemlerini kesmek yerine mevcut işlevselliği kullanarak elde edilmelerini sağlayan bir tanesi.

+1

Harika soru! 'Filter_volume' içindeki spline katsayılarından gradyanı elde etmek için oldukça yalın olmalıyım, ama korkarım ki sizden tam olarak nasıl daha iyi bir fikrim yok. Sormak isteyebilirsiniz scipy posta listesinde de. –

cevap

1

Aha: numpy kanunda yer classic paper on splines göre, düzenin spline'lar n ve bunların türevleri ben da daha düşük tutarak benim türevleri alabilir scipy spline interpolasyon kullanarak Yani

n   n-1   n-1 
dB (x)/dx = B (x+1/2) - B (x-1/2) 

tarafından ilişkilidir - önceden filtrelenmiş hacim ve türev başına birkaç kez sorgulama. Bu, hafızada bir miktar bellek eklenmesi anlamına gelir (belki önbellek için "ana" hacim ile rekabet), ancak alt sıradaki splineların muhtemelen daha hızlı değerlendirilmesi, daha hızlı mı, yoksa merkezi farklılıktan genel olarak mı olacağı belli değil. şu anda yapıyorum küçük ofsetler kullanarak. Henüz denemedim.

İlgili konular