2011-08-01 33 views
6

Tôi có một mảng giá trị khổng lồ của các giá trị vô hướng 3D (OK gọi nó là "âm lượng" nếu bạn phải). Tôi muốn nội suy một trường vô hướng trơn tru trong trường hợp này với sự kế thừa của bất thường, không phải tất cả các tọa độ xyz không được tích hợp phía trước được biết đến trước đây là .Làm thế nào để có được gradient của một nội suy scipy trực tiếp?

hỗ trợ

Bây giờ scipy cho đây chỉ là tuyệt vời: Tôi lọc âm lượng với

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

và gọi

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

cho (x, y, z) quan tâm để có được vẻ độc đáo cư xử (mịn, vv) các giá trị nội suy.

Cho đến nay rất tốt. Tuy nhiên, ứng dụng của tôi cũng cần các dẫn xuất cục bộ của trường nội suy. Hiện tại tôi có được những điểm khác biệt trung tâm này: Tôi cũng lấy mẫu ở mức 6 điểm bổ sung (điều này ít nhất có thể được thực hiện chỉ với một cuộc gọi đến map_coordinates) và tính toán ví dụ: x phái sinh từ (i(x+h,y,z)-i(x-h,y,z))/(2*h). (Có, tôi biết tôi có thể giảm số lượng vòi bổ sung xuống 3 và làm "một mặt" khác biệt, nhưng sự bất đối xứng sẽ làm phiền tôi.)

Bản năng của tôi là phải có cách trực tiếp hơn để lấy gradient nhưng tôi không biết đủ toán học spline (chưa) để tìm ra, hoặc hiểu những gì xảy ra trong sự can đảm của việc thực hiện Scipy: scipy/scipy/ndimage/src/ni_interpolation.c.

Có cách nào tốt hơn để có được gradient của tôi "trực tiếp hơn" hơn sự khác biệt trung tâm? Tốt nhất là cho phép chúng thu được bằng cách sử dụng chức năng hiện có thay vì tấn công vào các bộ phận bên trong của Sciper.

+1

Câu hỏi tuyệt vời! Tôi nghĩ rằng nó nên được khá thẳng về phía trước để có được gradient từ các hệ số spline trong 'lọc_volume', nhưng tôi sợ tôi không có bất kỳ ý tưởng tốt hơn về chính xác như thế nào hơn bạn ... Bạn có thể muốn hỏi trên danh sách gửi thư scipy, là tốt. –

Trả lời

1

Aha: theo classic paper on splines trích dẫn trong các mã NumPy, splines trật tự n và các dẫn xuất của họ có liên quan bởi

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

Vì vậy, sử dụng nội suy spline scipy của tôi thể được dẫn xuất của tôi bằng cách cũng duy trì một thấp đặt hàng khối lượng prefiltered và truy vấn rằng một vài lần cho mỗi phái sinh. Điều này có nghĩa là thêm một số lượng bộ nhớ hợp lý (có thể cạnh tranh với khối lượng "chính" cho bộ đệm), nhưng có lẽ việc đánh giá các splines bậc thấp hơn là nhanh hơn, vì vậy nó không rõ ràng cho dù nó có nhanh hơn hay không tổng thể. bằng cách sử dụng các khoản bù nhỏ tôi đang thực hiện. Chưa thử nó.

Các vấn đề liên quan