【问题标题】:Evaluating a matrix with strings to get Eigenvalues使用字符串评估矩阵以获得特征值
【发布时间】:2020-08-30 04:24:59
【问题描述】:

主要思想是用户将输入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)) 之类的东西来计算特征值。

任何关于如何更改矩阵元素的提示或建议将不胜感激。

提前谢谢你。

【问题讨论】:

  • 为什么要使用字符串,可以直接使用变量x和y

标签: python numpy matrix linear-algebra eigenvalue


【解决方案1】:

编写一个函数,将输入字符串解析为所需的格式。

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]]

【讨论】:

  • 太棒了!这正是我所需要的。非常感谢!
【解决方案2】:

您可以利用 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 的值将改为包含字符串计算为的任何数字。

【讨论】:

  • 使用 eval 可能不是解决这个问题的最佳方法。它没有捕捉到解决方案的意图。此外 eval 允许执行任意 python 代码,这在接受用户输入的代码中存在安全风险。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2014-07-12
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多