我正在寫一段Matlab代碼,它會對python進行一些調用。這些調用以字符串形式返回數據。我遇到的問題是將字符串轉換爲數字。它不那麼簡單,對於我的兩個調用來說,它將字符串轉換沒有問題,但對於第三個字符串,只有在矢量不超過Matlab命令窗口中的一行時才起作用。Matlab調用Python,返回向量,str2num不能在返回的向量上工作
我的代碼如下:
呼叫一個
Matlab的:
wind_direction=sprintf('python C:\\Users\\pduffy\\Documents\\MMI_Raptur_V2\\Python\\Distributions\\CDF.py %f %f %f %f %f %f %f %f %f', N,NE,E,SE,S,SW,W,NW,Iterations);
[status,Wind_Dir_string] = system (wind_direction);
Wind_Dir_shape=str2num(Wind_Dir_string);
Wind_Dir= reshape(Wind_Dir_shape,[],1)
的Python
import sys
import scipy.stats
def CDF_Random(N,NE,E,SE,S,SW,W,NW,Iterations):
WindDir = (0,45,90,135,180,225,270,315)
Freq=(N,NE,E,SE,S,SW,W,NW)
cdf=scipy.stats.rv_discrete(values=(WindDir,Freq))
cdf_rand=cdf.rvs(size=Iterations)
return (cdf_rand)
if __name__ == '__main__':
N = float(sys.argv[1])
NE = float(sys.argv[2])
E = float(sys.argv[3])
SE = float(sys.argv[4])
S = float(sys.argv[5])
SW = float(sys.argv[6])
W = float(sys.argv[7])
NW = float(sys.argv[8])
Iterations = float(sys.argv[9])
sys.stdout.write(str(CDF_Random(N,NE,E,SE,S,SW,W,NW,Iterations)))
調用兩個
Matlab的
fragment_velocity_string=sprintf('python C:\\Users\\pduffy\\Documents\\MMI_Raptur_V2\\Python\\Distributions\\beta.py %f %f %f %f', lower, mode, upper, Iterations);
[status,Vf_rpm_string] = system (fragment_velocity_string);
Vf_rpm_shape=str2num(Vf_rpm_string);
Vf_rpm= reshape(Vf_rpm_shape,[],1)
的Python
import sys
import numpy.random
def Beta_Random(lower,mode,upper,Iterations):
Iterations=int(Iterations)
mean=(1/6)*(lower+upper+(4*mode))
a=((mean-lower)*((2*mode)-lower-upper))/((mode-mean)*(upper-lower))
b=(a*(upper-mean))/(mean-lower)
beta_rand=numpy.random.beta(a,b,[Iterations])
rand_sample=(beta_rand*(upper-lower))+lower
return (rand_sample)
if __name__ == '__main__':
lower = float(sys.argv[1])
mode = float(sys.argv[2])
upper = float(sys.argv[3])
Iterations = float(sys.argv[4])
sys.stdout.write(str(Beta_Random(lower,mode,upper,Iterations)))
召喚3點一個引起我的問題
Matlab的
wind_speed_string=sprintf('python C:\\Users\\pduffy\\Documents\\MMI_Raptur_V2\\Python\\Distributions\\Weibull.py %f %f %f', alpha, beta, Iterations);
[status,Vw_resultant_string] = system (wind_speed_string) ;
Vw_shape=str2num(Vw_resultant_string);
Vw_resultant= reshape(Vw_shape,[],1)
的Python
import sys
import numpy.random
def Weibull_Random(alpha,beta,Iterations):
a=alpha
b=beta
weibull_rand=numpy.random.weibull(a,[Iterations])
rand_sample=((weibull_rand)*b)
return (rand_sample)
if __name__ == '__main__':
alpha = float(sys.argv[1])
beta = float(sys.argv[2])
Iterations = float(sys.argv[3])
sys.stdout.write(str(Weibull_Random(alpha,beta,Iterations)))
所以什麼都位數i設置Iterations
來,這個數量的值返回到Matlab的。在所有三個Matlab代碼中,我使用str2num
來轉換從Python接收到的數據,然後重塑它以創建單列矩陣。
對於第三段代碼,導致我出現問題的代碼,我嘗試使用numpy.around
將python中的數字四捨五入爲四位小數。我選擇了四個,因爲這與Matlab轉換爲使用str2num
相同。我也試過使用str2double
,但得到一個NAN
值返回。
所以正如我所說的,Matlab將把所有接收到的數據從python轉換爲數字Iterations
的第一段和第二段代碼。但只有當向量不超過第三行代碼行時纔有效,所以目前它僅適用於Iterations = 6
這對我來說似乎很奇怪,因爲除了函數之外,所有代碼段都非常相似他們用Python進行預處理。
我使用Windows 7,Matlab的2012年,Python的3 numpy的和SciPy的(pyzo2013b)
一如既往非常感謝你的時間和感謝你或許可以提供任何幫助。
編輯1-問題迎刃而解
我通過使用Wind_Dir_vector=regexprep(Wind_Dir_string,'\n',' ')
其替換爲空格字符新行字符解決了這個問題。我認爲這個問題是由於Matlab沒有能夠創建一個數組,因爲結果在每行中沒有相同數量的列,因爲它不知道應該放入剩餘單元格中。
希望這是有道理的,我在一個有點倉促。