主要思想是,用户将输入3个字符串来创建一个Hessian矩阵,以及两个或多个变量的值,目标是计算特征值,以知道矩阵是否是正定义的。
到目前为止,我已经尝试用int替换字符串,或者在矩阵上使用eval((函数,但它似乎与矩阵不兼容。
以下是我迄今为止所拥有的代码示例。
#Hessian
x = 0
y = 0
input_1 = '6x, -3, 0'
input_2 = '-3, 6y, 0'
input_3 = '0, 0, 0'
input_1 = input_1.replace('x', '*x')
input_2 = input_2.replace('y', '*y')
input_1 = input_1.split(',')
input_2 = input_2.split(',')
input_3 = input_3.split(',')
hess = np.matrix([input_1,input_2,input_3])
hess
哪个输出:
matrix([['6*x', ' -3', ' 0'],
['-3', ' 6*y', ' 0'],
['0', ' 0', ' 0']], dtype='<U4')
现在,问题是我找不到用上面声明的值替换变量"x"one_answers"y"的方法,因为它们仍然是字符串。
如果我能找到一种方法将矩阵的值转换为整数并替换这些值,那么我会使用类似eigenval = np.all(np.linalg.eigvals(hess))
的东西来计算本征值。
任何关于如何更改矩阵元素的提示或建议都将不胜感激。
提前谢谢。
编写一个函数,将输入字符串解析为所需格式。
def parse_input(instring, x, y):
xs = []
for i in instring.split(','):
if 'x' in i and 'y' in i:
xs.append(x * y * int(i.replace('x', '').replace(y, '')))
elif 'x' in i:
xs.append(x * int(i.replace('x', '')))
elif 'y' in i:
xs.append(y * int(i.replace('y', '')))
else:
xs.append(int(i))
return xs
样品运行:
>>> input_1 = '6x, -3, 0'
>>> input_2 = '-3, 6y, 0'
>>> input_3 = '0, 0, 0'
>>> [parse_input(s, 0, 0) for s in (input_1, input_2, input_3)]
[[0, -3, 0], [-3, 0, 0], [0, 0, 0]]
您可以利用python的eval
函数来评估字符串的值
例如,如果您的代码为:
x = 5
z = eval('10*x')
那么z将等于50。
然后可以使用map
函数将eval
映射到字符串列表中。如果你用这样的东西替换split
行:
input_1 = list(map(eval, input_1.split(',')))
input_2 = list(map(eval, input_2.split(',')))
input_3 = list(map(eval, input_3.split(',')))
那么包含x和y的值将包含字符串求值为的任何数字。