2013-07-09 49 views
0

我正在寫一段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來轉換從Pyt​​hon接收到的數據,然後重塑它以創建單列矩陣。

對於第三段代碼,導致我出現問題的代碼,我嘗試使用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沒有能夠創建一個數組,因爲結果在每行中沒有相同數量的列,因爲它不知道應該放入剩餘單元格中。

希望這是有道理的,我在一個有點倉促。

回答

0

我已經回答了我的問題是我的問題中修改,但我想我最好把一個實際的回答倒使人們對未來可能會找到一個解決方案更容易一點。

問題是Matlab的試圖把數據導入一個方陣,如果有沒有足夠的進口值創造一個完美的方陣,它不知道要放什麼東西在過去的幾列。所以當我試圖將數據字符串轉換爲數字(str2num)時,它感到困惑。

所以我做的是從導入的數據中刪除所有的換行符,使數據成爲一個很好的長列表,然後使用(str2num)函數,它的工作完美。

新行字符,使用這段代碼移除。

Wind_Dir_vector=regexprep(Wind_Dir_string,'\n',' ')