我正在编写一段 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 无法创建数组,因为它不知道在剩余的单元格中放入什么。
希望这是有道理的,我有点着急。