使用C ++ Eigen和matlab mexFunction的矩阵乘法问题

时间:2016-01-12 15:17:20

标签: c++ matlab matrix mex eigen

    // computing the matrix operation here
    // resultEigen = Input matrix
    // result1Eigen = hidden bias 
    // result2Eigen = visible bias
    // result3Eigen = weight matrix

     MatrixXd H;
     MatrixXd V;
     double well[36];
     Map<MatrixXd>( well, H.rows(), H.cols() ) = H;        
     H = resultEigen * result3Eigen + result1Eigen;
     mexPrintf("H is here\n");
        for (int i=0; i<36; i++)
          {

             mexPrintf("%d\n",H);
          }

            mexPrintf("\n");

我需要为我的RBM构建一个重建函数,因为直接矩阵乘法可以让我得到更好的结果,我一直指的是特征库来解决我的问题,但我遇到了一些困难。 当运行上面的代码时,我最终获得了H矩阵的单个值,我想知道为什么!

此外,用于计算H的参数已按如下方式启动:

         double *data1 = hbias;
         Map<VectorXd>hidden_bias(data1,6,1);
         VectorXd result1Eigen;
         double result1[6];
         result1Eigen = hidden_bias.transpose();
         Map<VectorXd>(result1, result1Eigen.cols()) = result1Eigen;
         // next param
         double *data2 = vbias;
         Map<VectorXd>visible_bias(data2,6,1);
         VectorXd result2Eigen;
         double result2[6];
         result2Eigen = visible_bias.transpose();
         Map<VectorXd>(result2, result2Eigen.cols()) = result2Eigen;
         // next param
         double *data3 = w;
         Map<MatrixXd>weight_matrix(data3,n_visible,n_hidden);
         MatrixXd result3Eigen;
         // double result3[36];

         mxArray * result3Matrix = mxCreateDoubleMatrix(n_visible, n_hidden, mxREAL );
         double *result3=(double*)mxGetData(result3Matrix);
         result3Eigen = weight_matrix.transpose();
         Map<MatrixXd>(result3, result3Eigen.rows(), result3Eigen.cols()) = result3Eigen

最后,我还面临在mexFunction内部使用std :: cout打印数据的问题。 感谢任何提示。

1 个答案:

答案 0 :(得分:1)

问题在于打印代码应该是:

mexPrintf("%d\n",H(i));

然后,不需要复制矢量和矩阵。例如,result1没用,因为您可以使用result1Eigen获取存储在result1Eigen.data()中的数据的原始指针。同样,您可以直接将weight_matrix.transpose()分配给Map<MatrixXd>(result3,...),但我不会看到well的目的。

最后,如果在编译时真的知道大小,那么最好使用Matrix<double,6,1>而不是VectorXdMatrix<double,6,6>而不是MatrixXd。你可以期待大幅加速。