<div dir="ltr"><div>Suppose, I have a 5x5 matrix and I want to differentiate the matrix wrt to a 5x1 matrix in order to obtain a 3D matrix or tensor. In the following code, A.diff(uL); cannot compile. Is it possible to differentiate a matrix with symbolic elements wrt to a vector which also contains symbols?<br></div><div><br></div><div>#include <iostream><br>#include <ginac/ginac.h><br>using namespace std;<br>using namespace GiNaC;<br><br>int main()<br>{<br>    const int DIM = 5;<br><br>    symbol g("g");<br><br>    symbol uL1("uL1");<br>    symbol uL2("uL2");<br>    symbol uL3("uL3");<br>    symbol uL4("uL4");<br>    symbol uL5("uL5");<br><br>    matrix uL = {<br>        {uL1},<br>        {uL2},<br>        {uL3},<br>        {uL4},<br>        {uL5}<br>    };<br><br>    auto qL = matrix(DIM, 1);<br><br>    qL(0,0) = sqrt(uL1);<br>    qL(1,0) = uL2 / qL(0,0);<br>    qL(2,0) = uL3 / qL(0,0);<br>    qL(3,0) = uL4 / qL(0,0);<br>    qL(4,0) = (uL5 + (g - 1) * (uL5 - 0.5 * (pow(uL2,2) + pow(uL3,2) + pow(uL4,2)) / uL1)) / uL1;<br><br>    symbol uR1("uR1");<br>    symbol uR2("uR2");<br>    symbol uR3("uR3");<br>    symbol uR4("uR4");<br>    symbol uR5("uR5");<br><br>    matrix uR = {<br>        {uR1},<br>        {uR2},<br>        {uR3},<br>        {uR4},<br>        {uR5}<br>    };<br><br>    auto qR = matrix(DIM, 1);<br><br>    qR(0,0) = sqrt(uR1);<br>    qR(1,0) = uR2 / qR(0,0);<br>    qR(2,0) = uR3 / qR(0,0);<br>    qR(3,0) = uR4 / qR(0,0);<br>    qR(4,0) = (uR5 + (g - 1) * (uR5 - 0.5 * (pow(uR2,2) + pow(uR3,2) + pow(uR4,2)) / uR1)) / uR1;</div><div>    <br></div><div>    auto q = qL.add(qR);<br>    q.mul_scalar(0.5);<br><br>    matrix B = {<br>        {2*q(0,0), 0, 0, 0, 0},<br>        {q(1,0), q(0,0), 0, 0, 0},<br>        {q(1,0), q(0,0), 0, 0, 0},<br>        {q(2,0), 0, q(0,0), 0, 0},<br>        {q(3,0), 0, 0, q(0,0), 0},<br>        {q(4,0)/g, (g-1)*q(1,0)/g, (g-1)*q(2,0)/g, (g-1)*q(3,0)/g, q(0,0)/g}<br>    };<br><br>    matrix C = {<br>        {q(1,0), q(0,0), 0, 0, 0},<br>        {(g-1)*q(4,0)/g, (g+1)*q(1,0)/g, (1-g)*q(2,0)/g, (1-g)*q(3,0)/g, (g-1)*q(0,0)/g},<br>        {0, q(2,0), q(1,0), 0, 0},<br>        {0, q(3,0), 0, q(1,0), 0},<br>        {0, q(4,0), 0, 0, q(1,0)}<br>    };<br><br>    auto A = B.mul(C.inverse());<br><br>    A.diff(uL);<br><br>    return 0;<br>}<br></div></div>