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&gt; 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&gt; 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&gt; 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&gt; sum(X)
     */
    return sum(sum(X))
}


-

static field&lt;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&lt;rowvec&gt;, mayebe a template should be used to generalize..
     *  MATLAB code&gt; num2cell(X)
     */
    field&lt;rowvec&gt; data1(X.n_rows,1);
for (uint r = 0; r &lt; X.n_rows; ++r) {
    data1(r,0) = X.row(r);
}
    return data1;
}
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.
*i is enough, you don't need (*i):

*i = log(*i);

This code:

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


can be written as:

return _s.is_empty();