您的位置:首页 > 编程语言 > MATLAB

python实现文本字符替换 MATLAB公式转化为C代码

2019-03-23 21:59 751 查看

欢迎转载,请注明出处!

©MrWang_tju 2019.3.21

MATLAB符号运算生成的公式,需要用ARM处理器进行运算。遇到了将MATLAB公式转化为C语言,指数表达方式不一致的困难。MATLAB生成的公式,指数表达方式为  x^y 形式,C数学库的指数表达形式为 pow(x,y)。故不能直接进行复制使用

考虑过MATLAB自动转化为C代码,但由于机构解算符号运算均在一个MATLAB文件中实现,定义变量过于复杂。

使用python脚本实现字符替换。

以下程序模块,供有字符替换需求的朋友参考

[code]import sys

"""
created by MrWang_tju 2019.3.21
function:
程序模块用于将matlab经符号运算生成的表达式转化为C代码
需要转化原因在于,MATLAB生成的表达式中,指数均以  x^y 的形式表达  而C数学库中使用 sqrt(x,y)  pow(x,y)表达。
程序实现*.txt文件修改,按照规则转化上述符号表达式
转换内容:
1.StrReplace1()     将开根号 ^(1/2) 转化为 sqrt()
2.StrReplace2()     将 x^(3/2) 转化为 pow(x,1.5)  注:GCC 4.9.2 DevC++ 编译环境  指数写为 pow(x,(3/2))不被正确处理
3.StrReplace3()     将 x^2 转化为 pow(x,2)

Notice:
程序模块转化并不具有普适性,需要观察MATLAB生成的表达式特征  进行替换

"""

"""
function:
将开根号 ^(1/2) 转化为 sqrt()
Args:
String line

Return:
Replaced String

"""
def StrReplace1(line):
SuccNum = 0
strFind = ')^(1/2)'
StrNum = line.find(strFind)   #找到 返回下标 否则返回-1
# print(line[10:15])
while StrNum != -1:
tempNum = StrNum
kNum = 1
while kNum > 0:
tempNum -= 1
if line[tempNum] == ')':    #确定开根号范围
kNum += 1
elif line[tempNum] == '(':
kNum -= 1
line_list = list(line) #将str转化为list
for i in range(6):      # 删掉 ^(1/2)
del line_list[StrNum]
i += 1
line_list.insert(tempNum, 'sqrt')   #添加sqrt
line = ''.join(line_list)   #将列表转化为字符串
# print(line,len(line))
SuccNum += 1
StrNum = line.find(strFind)
# print("替换^(1/2) %d 次\n" % SuccNum,line)
return line

"""
function:
将 x^(3/2) 转化为 pow(x,1.5)
Args:
String line

Return:
Replaced String

"""
def StrReplace2(line):
SuccNum = 0
strFind = ')^(3/2)'
StrNum = line.find(strFind)   #找到 返回下标 否则返回-1
while StrNum != -1:
tempNum = StrNum
kNum = 1
while kNum > 0:
tempNum -= 1
if line[tempNum] == ')':    #确定开根号范围
kNum += 1
elif line[tempNum] == '(':
kNum -= 1
line_list = list(line) #将str转化为list
for i in range(6):      # 删掉 ^(3/2)
del line_list[StrNum]
i += 1
line_list.insert(StrNum,'),1.5')  #添加 ,3/2)
line_list.insert(tempNum, 'pow(')   #添加pow(
line = ''.join(line_list)   #将列表转化为字符串
# print(line,len(line))
SuccNum += 1
StrNum = line.find(strFind)
# print("替换^(3/2) %d 次\n" % SuccNum,line)
return line

"""
function:
将 x^2 转化为 pow(x,2)
Args:
String line

Return:
Replaced String

"""
def StrReplace3(line):
SuccNum = 0
strFind = ')^2'
StrNum = line.find(strFind)   #找到 返回下标 否则返回-1
while StrNum != -1:
tempNum = StrNum
kNum = 1
while kNum > 0:
tempNum -= 1
if line[tempNum] == ')':    #确定开根号范围
kNum += 1
elif line[tempNum] == '(':
kNum -= 1
line_list = list(line) #将str转化为list
for i in range(3):      # 删掉 ^2
del line_list[StrNum]
i += 1
line_list.insert(StrNum,'),2)')  #添加 ,3/2)
tempNum -= 3
line_list.insert(tempNum, 'pow(')   #添加pow(
line = ''.join(line_list)   #将列表转化为字符串
# print(line,len(line))
SuccNum += 1
StrNum = line.find(strFind)
# print("替换^2 %d 次\n" % SuccNum,line)
return line

print("Begin")
f1 = open(r'C:\Users\Mrwang\Desktop\J.txt','r+')    #读取文件  注意路径
f2 = open(r'C:\Users\Mrwang\Desktop\JJ.txt','w+')   #创建要写入保存结果的文件
sort = 0
hang = 1
lie = 1
for i in range (145):
i += 1
line = f1.readline()
if len(line) > 20:
line = StrReplace1(line)  # 替换^(1/2)完成
line = StrReplace2(line)
line = StrReplace3(line)
print(line)
#格式输出  将jacobian矩阵按行、列形式输出
f2.write(ascii(hang))
f2.write(',')
f2.write(ascii(lie))
f2.write('\n')
f2.write(line)
sort += 1
lie = sort%6+1
hang = sort//6+1
f2.write('\n')

程序对存有雅克比矩阵表达式的txt文件进行读取,之后按照需要的规则进行字符替换,将替换后的公式按格式输出到新文件。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: