如何用SymPy中的向量替换矩阵的对角元素?

时间:2015-10-13 14:11:06

标签: python matrix sympy diagonal

我有一个向量X我就是这样创建的:

from sympy import *

x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')

X = Matrix([x1, x2, x3])

然后我还有一个矩阵myMat,它只包含一个:

myMat = ones(3, 3)

Matrix([
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])

现在我想用矢量X替换矩阵的对角线;我期望的结果如下:

Matrix([
[x1, 1, 1],
[1, x2, 1],
[1, 1, x3]])

我当然可以在for-loop这样做:

for ind, el in enumerate(X):
    myMat[ind, ind] = el

但我想知道是否有一种更聪明的方法可以直接访问该矩阵的对角线。虽然我可以计算矩阵的trace,但我找不到用myMat.diag = X之类的东西替换对角元素的方法。有没有办法做到这一点?

修改

@Emilien让我走上正轨,因此我接受了这个答案。在此答案的基础上,我还发布了自己的解决方案,该解决方案利用sympynumpy并在一行中解决问题:my answer

4 个答案:

答案 0 :(得分:3)

我建议将sympy.matrices.dense.MutableDenseMatrix 转换为numpy.ndarray并在完成后重新转换。类似的东西:

import numpy as np 
from sympy import *

x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')

X = Matrix([x1,x2,x3])
myMat = ones(3,3)


myMat1 = np.array(myMat)
myMat1[range(3),range(3)] = np.array(X).reshape(myMat1.shape[0])

myMat = Matrix(myMat1)

>> Matrix([
[x1,  1,  1],
[ 1, x2,  1],
[ 1,  1, x3]])

答案 1 :(得分:3)

你可以使用对角线和身份矩阵来构建它,我不确定它在vue思想的性能点上要好得多,但是如果你正在寻找的话,也许在阅读代码时更容易理解。

x1, x2, x3 = symbols('x1 x2 x3')
mat = diag(x1,x2,x3)-eye(3)+ones(3)

l = symbols('x1 x2 x3')
mat = diag(*l)-eye(3)+ones(3)

如你所愿。

另一个棘手的解决方案,可能不太可读:

l = symbols('x1 x2 x3')
Matrix(3, 3, lambda i,j: l[i] if i==j else 1)

最后,如果您不想修改原始

l = symbols('x1 x2 x3')
M = Matrix(([1,2,3],[4,5,6],[7,8,9]))
M = Matrix(3, 3, lambda i,j: l[i] if i==j else M[i,j])

答案 2 :(得分:0)

建立@Emilien答案,可以做到以下几点:

        Resources res = getResources();
        Configuration newConfig = new Configuration( res.getConfiguration() );
        Locale locale = new Locale( appLanguage );
        newConfig.locale = locale;
        newConfig.setLayoutDirection( locale );
        res.updateConfiguration( newConfig, null );

所以import sympy as sp import numpy as np x1 = sp.Symbol('x1') x2 = sp.Symbol('x2') x3 = sp.Symbol('x3') X = sp.Matrix([x1, x2, x3]) myM = 4 * sp.ones(3, 3) 看起来像这样:

myM

现在命令

Matrix([
[4, 4, 4],
[4, 4, 4],
[4, 4, 4]])

给出了预期的结果:

sp.diag(*X) + myM - sp.diag(*np.diag(myM))

分别使用Matrix([ [x1, 4, 4], [ 4, x2, 4], [ 4, 4, x3]]) diagsympy的不同功能;在numpy sympy中使用向量作为输入创建矩阵,使用此向量的元素作为矩阵的对角线

diag
sp.diag(*X) Matrix([ [x1, 0, 0], [ 0, x2, 0], [ 0, 0, x3]]) numpy中的

返回矩阵的对角线:

diag

答案 3 :(得分:-2)

如果您使用某些库函数来查找对角线,我100%确定库函数将使用" For"循环。只需运行一个嵌套的for循环,i从1变为Row.Count,j从1变为Columns.count。对角线是i = j的地方。做你想做的事。例如下面,你明白了

for (i=1; i<= Rows.Count; i++)
     for (j=1; j<= Columns.Count; j++)
          if (i==j)
          {
            // Do your Thing
          }
     end
 end