Thank you Claudio, and I apologize for not catching the typo. I remain a little confused about how to robustly simplify matrix expressions, though.
Here are a few examples:
ClearAll[J, Jp, Z, Zp, Ib, V, Vp, ass, n];
n = 4;
ass = {
Element[J, Matrices[{n, n}]],
Element[Ib, Matrices[{n, n}]],
Element[V, Matrices[{n, n}]],
J - Ib.V == 0
};
TensorReduce[Ib.V - J, Assumptions -> ass]
Simplify[TensorReduce[Ib.V - J, Assumptions -> ass]]
Simplify[Ib.V - J, Assumptions -> ass]
Out[314]= -J + Ib.V
Out[315]= -J + Ib.V
Out[316]= 0
Likewise,
ClearAll[J, Jp, Z, Zp, Ib, V, Vp, ass, n];
n = 4;
ass = {
Element[J, Matrices[{n, n}]],
Element[Ib, Matrices[{n, n}]],
Element[V, Matrices[{n, n}]],
J - Ib.V == 0
};
TensorReduce[Transpose[V + J], Assumptions -> ass]
TensorReduce[Conjugate[V + J], Assumptions -> ass]
TensorReduce[ConjugateTranspose[V + J], Assumptions -> ass]
Out[324]= TensorTranspose[J, {2, 1}] + TensorTranspose[V, {2, 1}]
Out[325]= Conjugate[J] + Conjugate[V]
Out[326]= ConjugateTranspose[J + V]
For the last example, I guess I could add another rule to make it work... Though generally speaking, I wonder how robustly these simplifications are being applied and how to specify rules to make the process more robust.