[英]How do I convert this Matlab code with meshgrid and arrays to Python code?
我正在嘗試編寫一個程序來構造一個矩陣並對其執行奇異值分解。 我正在評估網格上的函數ax^2 +bx + 1
。 然后我制作a
和b
的統一網格。 矩陣的行對應不同的二次系數,而每一列對應於評估函數的網格點。
matlab代碼在這里:
% Collect data
x = linspace(-1,1,100);
[a,b] = meshgrid(0:0.1:1,0:0.1:1);
D=zeros(numel(x),numel(a));
sz = size(D)
% Build “Dose” matrix
for i=1:numel(a)
D(:,i) = a(i)*x.^2+b(i)*x+1;
end
% Do the SVD:
[U,S,V]=svd(D,'econ');
D_reconstructed = U*S*V';
plot(diag(S))
scatter3(a(:),b(:),V(:,1))
這是我對解決方案的嘗試:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
def f(x, a, b):
return a*x*x + b*x + 1
a, b = np.mgrid[0:1:0.1,0:1:0.1]
#a = b = np.arange(0,1,0.01)
D = np.zeros((x.size, a.size))
for i in range(a.size):
D[i] = a[i]*x*x +b[i]*x +1
U, S, V = np.linalg.svd(D)
plt.plot(np.diag(S))
fig = plt.figure()
ax = plt.axes(projection="3d")
ax.scatter(a, b, V[0])
但我總是收到廣播錯誤,我不知道如何解決。
首先,在 MATLAB 中您分配給D(:,i)
,但在 python 中您分配給D[i]
。 后者相當於D[i, ...]
在你的情況下是D[i, :]
。 相反,您似乎需要D[:, i]
。
其次,在 MATLAB 中使用線性索引到二維數組(即a
和b
)會給你扁平化的視圖。 如果你用 numpy 這樣做,你會得到一個數組的切片,就像我在D[i]
提到的那樣。
您可以通過廣播消除循環並通過.ravel
ling(或重塑)您的a
和b
數組來獲得所需的二維數組:
x = np.linspace(-1, 1, 100)[:, None] # inject trailing singleton for broadcasting
a, b = np.mgrid[0:1:0.1, 0:1:0.1]
D = a.ravel() * x**2 + b.ravel() * x + 1
這種工作方式是在我們注入尾隨單例后x
具有形狀(100, 1)
(在 MATLAB 中隱含尾隨單例,在 numpy 前導單例中),並且a.ravel()
和b.ravel()
都具有形狀(10*10,)
與(1, 10*10)
兼容,使廣播成為可能的形狀(100, 10*10)
。 您還可以將調用ravel
替換為
a, b = np.mgrid[...].reshape(2, -1)
這是我有時使用的一個技巧,但如果您不熟悉該模式,則更難閱讀。
旁注:最好使用維度最終具有不同大小的示例數據,以便您注意到某些內容是否最終被轉置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.