我正在写一段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
^{pr2}$
呼叫2
Matlabfragment_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)
Pythonimport 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)))
打三个电话给我
Matlabwind_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)
Pythonimport 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将python中的数字舍入到四位小数。我选择了四个,因为这与Matlab转换为使用str2num的情况相同。我也尝试过使用str2double,但是返回了一个NAN值。在
所以正如我所说的,对于第一段和第二段代码,Matlab将把从python接收到的所有数据转换成任意数量的Iterations的数字。但是只有在第三段代码的向量不超过一行时才有效,所以目前它只适用于Iterations = 6
这对我来说很奇怪,因为除了在Python中实现的函数外,所有代码部分都非常相似。在
我使用的是Windows7、Matlab2012、Python3和Numpy和Scipy(pyzo2013b)
一如既往,非常感谢您抽出时间,并感谢您提供的任何帮助。在
编辑1-问题已解决
我通过使用Wind_Dir_vector=regexprep(Wind_Dir_string,'\n',' ')解决了这个问题,它用空格字符替换了新行字符。我认为问题是Matlab不能创建一个数组,当结果中每行的列数不相等时,因为它不知道在剩余的单元格中放入什么。在
希望这有道理,我有点赶时间。在