Matlab调用python,返回向量,str2num不能处理返回的向量

时间:2013-07-09 08:26:05

标签: python string matlab numbers

我正在编写一段Matlab代码,其中对python进行了大量调用。这些调用将数据作为字符串返回。我遇到的问题是将字符串转换为数字。它不是那么简单,但是对于我的两个调用它转换字符串没有问题但是对于第三个它只有在向量在Matlab命令窗口中不超过一行时才有效。

我的代码如下:

拨打一个

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)))

调用三个导致我出现问题的

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)))

那么我设置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',' ')解决了这个问题,{{1}}用空格字符替换了新的换行符。我认为问题在于Matlab无法在每行中没有相同数量的列时创建数组,因为它不知道要在剩余的单元格中放入什么。

希望这是有道理的,我有点匆忙。

1 个答案:

答案 0 :(得分:0)

我已经在我的问题中回答了我的问题,但我认为我最好将实际答案放下来,以便将来人们可以找到更容易的解决方案。

问题在于Matlab试图将导入的数据放入方形矩阵中,如果没有足够的值导入以创建完美的方形矩阵,则它不知道在最后几列中放入什么。因此,当我尝试将数据字符串转换为数字(str2num)时,它很困惑。

所以我做的是从导入的数据中删除所有换行符,有效地使数据成为一个很好的长列表,然后使用(str2num)函数,它完美地工作。

使用这段代码删除了新的行字符。

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