I suppose that it is a feature... (matrix(3,1,lst(0,0,1)).transpose()*matrix(3,1,lst(0,0,1))).evalm() gives a 1,1 matrix [[1]]. To convert it to a number or to a expression not containing a matrix, I have to take directly the 0,0 element of the matrix. Is there a more direct method? If not I'm facing errors like (in ginsh notation)
a=[[0,0,1]]*[[0],[0],[1]]; a=evalm(a); [[1]] 1+cos(a); add::eval(): sum of non-commutative objects has non-zero numeric term
Thank you Javier Ros
Hello! On Fri, Mar 17, 2006 at 07:52:15PM +0100, Javier Ros Ganuza wrote:
I suppose that it is a feature...
Exactly. Unit element of some algebra and number 1 are distinct objects, so GiNaC _never_ performs implicit conversion of unit element of an algebra to number 1 or vice a versa.
(matrix(3,1,lst(0,0,1)).transpose()*matrix(3,1,lst(0,0,1))).evalm()
gives a 1,1 matrix [[1]].
Yes, the product of matrices is a matrix of appropriate size.
To convert it to a number or to a expression not containing a matrix, I have to take directly the 0,0 element of the matrix.
Is there a more direct method?
You could try to rewrite your expression[s] in a tensor-like form, e.g. #include <iostream> #include <ginac/ginac.h> using namespace std; using namespace GiNaC; int main(int argc, char** argv) { idx i(symbol("i"), 3); idx j(symbol("j"), 1); matrix A(1, 3); A = 0, 0, 1; ex e = indexed(A.transpose(), i, j)*indexed(A, j, i); cout << e << " ==> "; e = e.simplify_indexed(); cout << e << endl; } On my system, this gives: [[0],[0],[1]].i.j*[[0,0,1]].j.i ==> 1
If not I'm facing errors like (in ginsh notation)
a=[[0,0,1]]*[[0],[0],[1]]; a=evalm(a); [[1]] 1+cos(a); add::eval(): sum of non-commutative objects has non-zero numeric term
Once again, GiNaC never performs implicit conversion of number 1 into unit element of some algebra (in this case -- 1x1 matrices). Best regards, Alexei. -- All science is either physics or stamp collecting.
participants (2)
-
Javier Ros Ganuza
-
varg@theor.jinr.ru