# MATLAB and Armadillo, hints on translating

i'm rewriting some Matlab code to c++ using armadillo, a libs for linear algebra. really good libs, IMHO. but i had to translate some matlab construct because armadillo isn't matlab.

i want to share my little snippet because i think there should be a better way (in terms of speed, mainly) to solve thoose little problems. i hope someone here could help me to improve my code!

static mat log(mat A) {
/*
* log function operates element-wise on matrix A
* MATLAB code> log(A)
*/
mat X(A);
mat::iterator a = X.begin();
mat::iterator b = X.end();

for(mat::iterator i=a; i!=b; ++i) {
(*i) = log(*i);
}
return X;
}


-

static mat vectorize(mat A) {
/*
* vectorise a matrix (ie. concatenate all the columns or rows)
* MATLAB code> A(:)
*/
mat B = mat(A);
B.reshape(B.n_rows*B.n_cols, 1);
return B;
}


-

static bool any(mat X, double n) {
/*
* check if there are some n in X
* MATLAB code> any(X==n)
* TODO: i'm not sure of description but it works for me
*/
uvec _s = find(, n);
if ( _s.is_empty() )
return true;
else
return false;
}


-

static double sum(mat X) {
/*
* sum a matrix
* MATLAB code> sum(X)
*/
return sum(sum(X))
}


-

static field<rowvec num2cell(mat X) {
/*
*  converts matrix X into field by placing each row of X into a separate row
*  this method assume that a cell is a field<rowvec>, mayebe a template should be used to generalize..
*  MATLAB code> num2cell(X)
*/
field<rowvec> data1(X.n_rows,1);
for (uint r = 0; r < X.n_rows; ++r) {
data1(r,0) = X.row(r);
}
return data1;
}

-

Cannot say much about the speed, but here are two observations:

• Your implementation of any appears to give true and false in the opposite way that Matlab would give them.

• If you want to mimic the n dimensional matrix sum in Matlab, the output should not be a number but a n-1 dimensional matrix. In case of a 'regular' matrix the output should be a vector.

-
1. You're doing a copy in most of those snippets: if it was possible to do without a copy, it could be faster. Libraries such as Boost often offer two version a specific function: one which copies and another one which modifies in place.

2. *i is enough, you don't need (*i):

(*i) = log(*i);

3. This code:

if ( _s.is_empty() )
return true;
else
return false;


can be written as:

return _s.is_empty();

-