在我的問題中,我有一個函式在一個或多個引數上變化并輸出一個矩陣。這個函式現在被采樣了。所以假設函式 F 依賴于 x 和 y,那么對于某些 xy 網格,我對每個網格點都有一個矩陣。
在 MATLAB 中,我使用 4D 矩陣來解決這個問題,其中前兩個維度是矩陣本身,其余是 xy 網格的坐標。請參閱以下示例:
n = 2;
% x-y grid
xg = [-1, 1, 7];
sz_xg = size(xg,2);
yg = [3, 4, 9];
sz_yg = size(yg,2);
% some function:
fcn = @(x,y) [3*x sin(y), cos(x); exp(-x), 5 y]; % some n x n matrix function
% Define grid
A = zeros(n,n,sz_xg,sz_yg);
for i = 1:sz_xg
for j = 1:sz_yg
A(1:n, 1:n, i, j) = fcn(xg(i), yg(j));
end
end
xpoint = 5;
ypoint = 6;
Ainterp = interpn(1:n, 1:n, xg, yg, A, 1:n, 1:n, xpoint, ypoint)
我也嘗試在 Python 中解決這個問題,但沒有成功。當我嘗試實作完全相同的示例時,我得到了一個 2x1 向量...
我的嘗試:
import numpy as np
from scipy.interpolate import interpn
n = 2
xg = np.array([-1, 1, 7])
yg = np.array([3, 4, 9])
# some function
def fcn(x,y):
return np.array([[3*x np.sin(y), np.cos(x)],[np.exp(-x), 5 y]])
A = np.zeros((n,n,xg.size,yg.size))
for i in range(xg.size):
for j in range(yg.size):
A[:,:,i,j]=fcn(xg[i],yg[j])
xpoint = 5
ypoint = 6
At = interpn((np.arange(n), np.arange(n), xg, yg),
A,(np.arange(0,n),np.arange(0,n),xpoint,ypoint))
你能幫我一下嗎?
uj5u.com熱心網友回復:
Matlab 和 scipy 的 interpn 實作略有不同。
Matlab 回傳輸入向量上的排列,因此當您為第一維和第二維指定 [1,2] 時,它回傳值在
[(1,1) (1,2);
(2,1) (2,2)]
然而這不是 scipy interpn 的情況,scipy 使用并行陣列來確定插值的位置,這意味著第一個輸出是從兩個陣列中的第一個輸入構建的,第二個輸出是從兩個陣列中的第二個輸入構建的,所以在。
為了獲得您想要的行為,您必須使用下面描述的更有效的方法傳遞上面列出的整個矩陣:
grid_points = np.meshgrid(np.arange(0,n),np.arange(0,n),sparse=True)
At = interpn((np.arange(n), np.arange(n), xg, yg),
A,(grid_points[0],grid_points[1],xpoint,ypoint))
基本上,meshgrid(sparse=True) 將以一種高效且記憶體壓縮的方式為您生成我上面寫的矩陣。
在我看來,python 方法比 matlab 更容易預測,因為它更容易確定輸出陣列的維度,不像在 matlab 中,輸出的維度是基于有多少輸入不是單個值,這使得很難預測輸出中維度的順序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/389981.html
上一篇:selenium.common.exceptions.WebDriverException:訊息:“WebScraping”可執行檔案可能有錯誤的權限
