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文件进行读取,之后按照需要的规则进行字符替换,将替换后的公式按格式输出到新文件。
相关文章推荐
- php替换超长文本中的特殊字符的函数代码
- [python] 基于k-means和tfidf的文本聚类代码简单实现
- python替换UTF-8编码文本中任意特殊字符,包括中文符号
- Python实现将文本分句代码
- 层次分析法(AHP) 将评判矩阵转化为权重矩阵代码实现 MATLAB
- js替换字符串中所有指定的字符(实现代码)
- asp.net高效替换大容量字符实现代码
- 易语言实现批量文本替换操作的代码
- python 时间戳与格式化时间的转化实现代码
- 实现字节流转化成字符流的模板代码
- Python实现将16进制字符串转化为ascii字符的方法分析
- 正则提取关键字符-python代码实现
- 剪切波的一些知识(附python及matlab实现剪切波变换的代码)
- python使用simhash实现文本相似性对比(全代码展示)
- Jquery replace 字符替换实现代码
- python 时间戳与格式化时间的转化实现代码
- 基于python写的专门用于字符串匹配的smartscript实现代码
- java代码实现将无表头.txt文本文件转化为weka能识别.arff文件
- 皮尔逊相关系数 定义+python代码实现 (与王印讨论公式)
- Python使用正则表达式实现文本替换的方法