用字符串评估矩阵以获得特征值
Evaluating a matrix with strings to get Eigenvalues
主要思想是用户将输入 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' 和 '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 的值将包含字符串求得的任何数字。
主要思想是用户将输入 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' 和 '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 的值将包含字符串求得的任何数字。