前面用 C 寫了個庫, 矩陣的基本運算都包涵了, +-*/ 求逆, rref(行最簡形)等, 並且利用這個庫實現了另外一些功能, 如 線性方程組求解, 線性迴歸, 線性規劃(正在寫, 個人感覺比較難)
可是使用的時候及其不便, 由於文本解析問題。 最近學了些python, 於是發現這個用來解析文本不錯, 於是就寫了個。
只要達到係數變數分離就好辦了。
#!/usr/bin/env python#coding=utf-8import re'''coeffTable 是 {變數:係數列表}, 如果不懂, 請運行看程式結果就懂了建議看之前先運行一下看看結果''' coeffTable = {'__LENGTH__': 0, '__CONS__':[]}def parseEquation(str): # 分離係數與變數 pattern = r'(^\s*\d*|[+-]\s*\d*)\s*(\w*)' # 用來分離變數與係數的運算式。 ptrn = re.compile(pattern) left, right = str.split('=') # 方程左右兩邊分離 coeffTable['__CONS__'].append(float(right.strip())) # 右邊加入到常量 # 請將 1, 2, 3 結合起來看, 比較容易懂 # 1. 原有變數的係數列表在後面添加一個0, 同時列表長度增加 1 for key in coeffTable: if key not in ('__LENGTH__', '__CONS__'): coeffTable[key].append(0) coeffTable['__LENGTH__'] += 1 # 遍曆在新方程中出現的變數並轉換其對應係數 for val in ptrn.findall(left): # 轉換係數 if val[0] == '-': coeff = 1 elif val[0][-1].isspace(): if val[0][0] == '-': coeff = -1 else: coeff = 1 else: coeff = float(''.join(val[0].split())) # 去掉所有空白字元後轉換成 float 數 varName = ''.join(val[1].split()) #去掉所有空白字元,獲得變數名 coffList = coeffTable.get(varName) # 2. 將新出現的變數添加至係數表 if coffList == None: coeffTable[varName] = [] for i in range(coeffTable.get('__LENGTH__')): coeffTable[varName].append(0) # 3. 將該變數的係數列表的最後一個係數變成當前方程對應的係數 coeffTable[varName][-1] = coeff # 測試if __name__ == '__main__': equation = '3x + 4y - z - a + b + 3c = 7' print(equation) parseEquation(equation) equation = '7x - 6y = 9' print(equation) parseEquation(equation) print(coeffTable)