我正在编写一段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
将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无法在每行中没有相同数量的列时创建数组,因为它不知道要在剩余的单元格中放入什么。
希望这是有道理的,我有点匆忙。
答案 0 :(得分:0)
我已经在我的问题中回答了我的问题,但我认为我最好将实际答案放下来,以便将来人们可以找到更容易的解决方案。
问题在于Matlab试图将导入的数据放入方形矩阵中,如果没有足够的值导入以创建完美的方形矩阵,则它不知道在最后几列中放入什么。因此,当我尝试将数据字符串转换为数字(str2num)
时,它很困惑。
所以我做的是从导入的数据中删除所有换行符,有效地使数据成为一个很好的长列表,然后使用(str2num)
函数,它完美地工作。
使用这段代码删除了新的行字符。
Wind_Dir_vector=regexprep(Wind_Dir_string,'\n',' ')