Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

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;
}
share|improve this question

2 Answers 2

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.

share|improve this answer
  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();
    
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.