0

我正在编写一段 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转换从 Python 接收到的数据,然后对其进行整形以创建单列矩阵。

对于第三段代码,也就是导致我出现问题的代码,我尝试使用numpy.around. 我选择了四个,因为这与 Matlab 转换为 using 相同str2num。我也尝试过使用str2double,但返回了一个NAN值。

因此,正如我所说,Matlab 会将所有从 python 接收到的数据转换Iterations为第一段和第二段代码的任意数量的数字。但是只有当向量不超过第三段代码的一行时才会起作用,所以目前它只适用于Iterations = 6

这对我来说似乎很奇怪,因为所有代码部分都非常相似,除了它们在 Python 中执行的函数。

我正在使用带有 Numpy 和 Scipy 的 Windows 7、Matlab 2012、Python 3 (pyzo2013b)

一如既往,非常感谢您抽出宝贵的时间,并感谢您提供的任何帮助。

编辑 1- 问题已解决

我通过使用Wind_Dir_vector=regexprep(Wind_Dir_string,'\n',' ')which 用空格字符替换换行符解决了这个问题。我认为问题在于当结果在每行中没有相同数量的列时,Matlab 无法创建数组,因为它不知道在剩余的单元格中放入什么。

希望这是有道理的,我有点着急。

4

1 回答 1

0

我已经回答了我的问题作为我的问题中的一个编辑,但我认为我最好把一个实际的答案写下来,这样将来的人们可能会更容易找到一个解决方案。

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

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

使用这段代码删除了换行符。

Wind_Dir_vector=regexprep(Wind_Dir_string,'\n',' ') 
于 2013-07-16T13:21:40.220 回答