I have a vector X
which I created like this:
from sympy import *
x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')
X = Matrix([x1, x2, x3])
Then I also have a matrix myMat
which just contains ones:
myMat = ones(3, 3)
Matrix([
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
Now I would like to replace the diagonal of the matrix by my vector X
; my desired outcome looks like this:
Matrix([
[x1, 1, 1],
[1, x2, 1],
[1, 1, x3]])
I can of course do it in a for-loop
like this:
for ind, el in enumerate(X):
myMat[ind, ind] = el
but I am wondering whether there is a smarter way of doing that by directly accessing the diagonal of this matrix. While I can calculate the trace
of the matrix, I could not find a way to replace just the diagonal elements using something like myMat.diag = X
. Is there a way of doing that?
EDIT
@Emilien got me on the right track and therefore I accepted this answer. Building up on this answer, I also posted my own solution which makes use of sympy
and numpy
and solves the problem in one single line: my answer