TMatrixTSym template compilation problem

Hello,

I am using the TMatrixTSym template to create a symmetric matrix. I have done a similar test like:

#include <TMatrixTSym.h>
TMatrixTSym<int>  mat;

When I compile, it give out errors:

MatrixTool.cxx:(.text+0x12ac): undefined reference to `TMatrixTSym<int>::Delete_m(int, int*&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o: In function `TMatrixTSym<int>::IsA() const':
MatrixTool.cxx:(.text._ZNK11TMatrixTSymIiE3IsAEv[TMatrixTSym<int>::IsA() const]+0x14): undefined reference to `TMatrixTSym<int>::Class()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o: In function `TMatrixTSym<int>::Clear(char const*)':
MatrixTool.cxx:(.text._ZN11TMatrixTSymIiE5ClearEPKc[TMatrixTSym<int>::Clear(char const*)]+0x46): undefined reference to `TMatrixTSym<int>::Delete_m(int, int*&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o: In function `TMatrixTBase<int>::IsA() const':
MatrixTool.cxx:(.text._ZNK12TMatrixTBaseIiE3IsAEv[TMatrixTBase<int>::IsA() const]+0x14): undefined reference to `TMatrixTBase<int>::Class()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o: In function `TMatrixTSym<int>::~TMatrixTSym()':
MatrixTool.cxx:(.text._ZN11TMatrixTSymIiED0Ev[TMatrixTSym<int>::~TMatrixTSym()]+0x76): undefined reference to `TMatrixTSym<int>::Delete_m(int, int*&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o: In function `TMatrixTSym<int>::~TMatrixTSym()':
MatrixTool.cxx:(.text._ZN11TMatrixTSymIiED1Ev[TMatrixTSym<int>::~TMatrixTSym()]+0x6e): undefined reference to `TMatrixTSym<int>::Delete_m(int, int*&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x38): undefined reference to `TMatrixTBase<int>::Draw(char const*)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0xa8): undefined reference to `TMatrixTBase<int>::Print(char const*) const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0xe8): undefined reference to `TMatrixTSym<int>::ShowMembers(TMemberInspector&, char*)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0xec): undefined reference to `TMatrixTSym<int>::Streamer(TBuffer&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x110): undefined reference to `TMatrixTSym<int>::SetMatrixArray(int const*, char const*)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x118): undefined reference to `TMatrixTSym<int>::GetSub(int, int, int, int, TMatrixTBase<int>&, char const*) const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x11c): undefined reference to `TMatrixTSym<int>::SetSub(int, int, TMatrixTBase<int> const&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x120): undefined reference to `TMatrixTBase<int>::GetMatrix2Array(int*, char const*) const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x124): undefined reference to `TMatrixTBase<int>::InsertRow(int, int, int const*, int)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x128): undefined reference to `TMatrixTBase<int>::ExtractRow(int, int, int*, int) const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x12c): undefined reference to `TMatrixTSym<int>::Shift(int, int)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x130): undefined reference to `TMatrixTSym<int>::ResizeTo(int, int, int)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x134): undefined reference to `TMatrixTSym<int>::ResizeTo(int, int, int, int, int)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x138): undefined reference to `TMatrixTSym<int>::Determinant() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x13c): undefined reference to `TMatrixTSym<int>::Determinant(double&, double&) const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x140): undefined reference to `TMatrixTBase<int>::Zero()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x144): undefined reference to `TMatrixTBase<int>::Abs()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x148): undefined reference to `TMatrixTBase<int>::Sqr()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x14c): undefined reference to `TMatrixTBase<int>::Sqrt()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x150): undefined reference to `TMatrixTBase<int>::UnitMatrix()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x154): undefined reference to `TMatrixTBase<int>::NormByDiag(TVectorT<int> const&, char const*)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x158): undefined reference to `TMatrixTBase<int>::RowNorm() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x15c): undefined reference to `TMatrixTBase<int>::ColNorm() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x160): undefined reference to `TMatrixTBase<int>::E2Norm() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x164): undefined reference to `TMatrixTBase<int>::NonZeros() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x168): undefined reference to `TMatrixTBase<int>::Sum() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x16c): undefined reference to `TMatrixTBase<int>::Min() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x170): undefined reference to `TMatrixTBase<int>::Max() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x17c): undefined reference to `TMatrixTSym<int>::Apply(TElementActionT<int> const&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x180): undefined reference to `TMatrixTSym<int>::Apply(TElementPosActionT<int> const&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x184): undefined reference to `TMatrixTSym<int>::Randomize(int, int, double&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV11TMatrixTSymIiE[vtable for TMatrixTSym<int>]+0x188): undefined reference to `TMatrixTSym<int>::RandomizePD(int, int, double&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x38): undefined reference to `TMatrixTBase<int>::Draw(char const*)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0xa8): undefined reference to `TMatrixTBase<int>::Print(char const*) const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0xe8): undefined reference to `TMatrixTBase<int>::ShowMembers(TMemberInspector&, char*)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0xec): undefined reference to `TMatrixTBase<int>::Streamer(TBuffer&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x110): undefined reference to `TMatrixTBase<int>::SetMatrixArray(int const*, char const*)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x114): undefined reference to `TMatrixTBase<int>::IsSymmetric() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x120): undefined reference to `TMatrixTBase<int>::GetMatrix2Array(int*, char const*) const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x124): undefined reference to `TMatrixTBase<int>::InsertRow(int, int, int const*, int)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x128): undefined reference to `TMatrixTBase<int>::ExtractRow(int, int, int*, int) const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x12c): undefined reference to `TMatrixTBase<int>::Shift(int, int)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x140): undefined reference to `TMatrixTBase<int>::Zero()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x144): undefined reference to `TMatrixTBase<int>::Abs()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x148): undefined reference to `TMatrixTBase<int>::Sqr()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x14c): undefined reference to `TMatrixTBase<int>::Sqrt()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x150): undefined reference to `TMatrixTBase<int>::UnitMatrix()'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x154): undefined reference to `TMatrixTBase<int>::NormByDiag(TVectorT<int> const&, char const*)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x158): undefined reference to `TMatrixTBase<int>::RowNorm() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x15c): undefined reference to `TMatrixTBase<int>::ColNorm() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x160): undefined reference to `TMatrixTBase<int>::E2Norm() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x164): undefined reference to `TMatrixTBase<int>::NonZeros() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x168): undefined reference to `TMatrixTBase<int>::Sum() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x16c): undefined reference to `TMatrixTBase<int>::Min() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x170): undefined reference to `TMatrixTBase<int>::Max() const'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x17c): undefined reference to `TMatrixTBase<int>::Apply(TElementActionT<int> const&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x180): undefined reference to `TMatrixTBase<int>::Apply(TElementPosActionT<int> const&)'
TrkAlignGenToolsLibtemp_shlib/MatrixTool.o:(.data.rel.ro._ZTV12TMatrixTBaseIiE[vtable for TMatrixTBase<int>]+0x184): undefined reference to `TMatrixTBase<int>::Randomize(int, int, double&)'
collect2: ld returned 1 exit status
gmake[3]: *** [../i686-slc5-gcc43-opt/libTrkAlignGenToolsLib.so] Error 1
gmake[2]: *** [TrkAlignGenToolsLib] Error 2
gmake[1]: *** [common_target] Error 2
gmake: *** [check_config] Error 2

Could anyone give some suggestions? Thanks in advance.
Jike

Hi,

we don’t provide a dictionary for the rarely used TMatrixTSym; you will have to create your own. See root.cern.ch/drupal/content/inte … s-rootcint on how to do that. And if you require all symbols to be resolved for your shared library (I believe you do, but you forgot to show the invocation that caused your error messages) then you’ll have to link with libMatrix.

Cheers, Axel.

Hi Axel,

By your idea, I have create a file TMatrixPF.h, in which is:

#include <TMatrixTSym.h>
#include "PrecisionFloat.h"
typedef TMatrixTSym<Trk::PrecisionFloat>  TMatrixPFSym;

Here PrecisionFloat is a class which is created by myself. So I want to create symmetric matrix which contains Trk::PrecisionFloat type elements, not fundamental type such as double, int. Then I do:

rootcint TMatrixPFDict.cxx  -c TMatrixPF.h 

But I get errors:

 Error: link requested for unknown class TMatrixPF G__auto6679LinkDef.h:7:
Warning: Error occurred during reading source files
Warning: Error occurred during dictionary source generation
!!!Removing TMatrixPFDict.cxx TMatrixPFDict.h !!!
Error: rootcint: error loading headers...

Could you give some suggestion?
Thanks!
Jike

Hi,

the linked web page explains; I would appreciate if you could re-read the part on the file “LinkDef.h” and let me know if something was not clear.

Cheers, Axel.

Hi Axel,

Thanks for your suggestion. I have done another very simple test:

 [code]

MyClass.h:

 #include <TMatrixTSym.h>
 template class TMatrixTSym<int>;
 template class TMatrixTBase<int>;
 template class TMatrixTRow_const<int>;
 template class TMatrixTRow<int>;

main.cxx:

#include <iostream>
#include "MyClass.h"
#include <TMatrixTSym.h>

int main(){

   std::cout <<" be here 1: "<<std::endl;
   TMatrixTSym<int> a(5,0);
   std::cout <<" be here 2: "<<std::endl;
   std::cout <<"a[0][0]: "<< a[0][0]<<std::endl;

   return 0;

}

LinkDef.h:

#ifdef __CINT__
#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;
#pragma link C++ nestedclasses;
#pragma link C++ defined_in "MyClass.h"; 
#endif

[/code]

Then I do:

rootcint  -f MyClassDict.cxx  -c MyClass.h Linkdef.h

The files MyClassDict.cxx and MyClassDict.h can be successfully generated.
Then I compile:

g++ `root-config --cflags --libs` MyClass.h MyClassDict.h MyClassDict.cxx main.cxx

It also can successfully compile, but when run, I get a segmentation violation at the line:
TMatrixTSym a(5,0);
in the main.cxx

So where is the problem? Cheers,
Jike

Hi,

what are you trying to do with TMatrixTSym a(5,0)? If you want a symmetrical 5x5 matrix please use this constructor: TMatrixTSym a(5)

Just to make sure you realize: a TMatrixTSym is a symmetrical matrix where each matrix element can only count! Addition and multiplication should work but all the rest doesn’t make a lot of sense with TMatrixTSym…

Cheers, Axel.

Hi Axel,

I just tried the way: TMatrixTSym a(5). It also crashed. I think there are maybe some problems in my generation of the dictionary. Please help me to check.
In fact, I don’t want to use the instantiation class TMatrixTSym, it is purely a test of the template TMatrixTSym . My purpose is to use the template TMatrixTSym to create a matrix whose elements are a data type which is defined by myself.

Cheers,
Jike

Hi,

before making any dictionary, I would try to compile and run your TMatrixTSym in a C++ program.
Like this you can also find out if it will work and what is required in YourType to work inside TMatrixTSym.

Eventually you can also try to use the SMatrix classes. There you might have more chances to work with YourType

Best Regards

Lorenzo

Hi Lorenzo,

Thanks for the suggestion. In the beginning, I have tried the TMatrixTSym in a complex C++ code, but I can’t success, so I go back to test the simplest TMatrixTSym. The other main reason of my choosing TMatrixTSym is, a TMatrixTSym object can be stored into disk directly.
I have just tried SMatrix<int, 15, 25>, I don’t need to generate the dictionary and it works fine. But does SMatrix can be stored into disk directly? How big the size of the SMatrix can accept?

Cheers,
Jike

Hi,

you can store an SMatrix using for example a TTree. An example is given in the test program testIO.cxx
( root.cern.ch/viewvc/trunk/math/s … iew=markup ) , see the function writeSMatrix.

In principle there is no limit on the size, however, since expression templates are used for matrix multiplication,
using an iterative compile time procedure, it will generate a large compile code.
If you are not multiplying the matrices, but using them just for storing the data, it should be fine

Lorenzo