簡體   English   中英

如何將此帶有網格和數組的 Matlab 代碼轉換為 Python 代碼?

[英]How do I convert this Matlab code with meshgrid and arrays to Python code?

我正在嘗試編寫一個程序來構造一個矩陣並對其執行奇異值分解。 我正在評估網格上的函數ax^2 +bx + 1 然后我制作ab的統一網格。 矩陣的行對應不同的二次系數,而每一列對應於評估函數的網格點。

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 中使用線性索引到二維數組(即ab )會給你扁平化的視圖。 如果你用 numpy 這樣做,你會得到一個數組的切片,就像我在D[i]提到的那樣。

您可以通過廣播消除循環並通過.ravel ling(或重塑)您的ab數組來獲得所需的二維數組:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM