[ADMB Users] Interfacing with software which expects a matrix objects values to be contiguous
dave fournier
davef at otter-rsch.com
Sun Oct 2 11:29:12 PDT 2011
A lot of software expects the values of a matrix to be in a vector of
contiguous values.
This is inconvenient for ADMB users because the usual constructor uses
an array of vectors.
This comes up in GPU processing as well as using BLAS. It is however a
simple matter to
change the behaviour of the software so that a matrix consists of a
vector of
contiguous values (they are stored by row and not by column, however.)
Here is an example of how to do it.
#include <admodel.h>
dmatrix unstack_dvector(int lr,int ur,int lc ,int uc,dvector& v)
{
// should ckeck size
int rowsize=ur-lr+1;
int colsize=uc-lc+1;
int ssize=rowsize*colsize;
int vmin=v.indexmin();
if (ssize != v.indexmax()-vmin+1)
{
cerr << "size error in unstack_dvector" << endl;
ad_exit(1);
}
dmatrix M(lr,ur);
//lc+offset=vmin;
int offset=vmin-lc;
for (int i=lr;i<=ur;i++)
{
M(i)=v(lc+offset,uc+offset).shift(lc);
offset+=uc-lc+1;
}
return M;
}
void printout(double * v,int n)
{
for (int i=0;i<n;i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main(int argc,char * argv[])
{
dvector v(1,40);
v.fill_seqadd(1,1);
dmatrix M=unstack_dvector(1,10,2,5,v);
cout << M << endl;
// interface with a C like zero offset pointer function
printout(&v(1),40);
}
More information about the Users
mailing list