【问题标题】:Matrix multiplication issues using C++ Eigen, and matlab mexFunction使用 C++ Eigen 和 matlab mexFunction 的矩阵乘法问题
【发布时间】:2016-04-17 06:48:04
【问题描述】:
    // 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 构建一个重构函数,因为直接矩阵乘法可以让我得到更好的结果,我一直在参考 eigen 库来解决我的问题,但我遇到了一些困难。 运行上面的代码时,我最终得到了 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 打印数据的问题。 感谢您的任何提示。

【问题讨论】:

  • cout 问题之前已经出现过,mathworks.com/matlabcentral/newsreader/view_thread/5990 我假设你在 windows 上运行这个?
  • 是的 Patrik,我在 Windows 上运行它,我也会看看你刚刚分享的链接。谢谢
  • 进一步,看你的代码似乎有点奇怪。我没有使用本征,但有一些事情浮现在脑海中。比如H的大小是多少? H.rows()H.cols() 返回什么?如果我要编写一个默认构造函数来初始化矩阵,我会将矩阵初始化为大小为 [0,0] 的空矩阵。然后我会有一些重载的构造函数初始化一个大小为 [N,M] 的矩阵。快速查看 eigen 给人的印象是这就是发生的事情。尝试将您的矩阵初始化为 6×6 矩阵或其他东西,并尝试在网上找到教程。

标签: c++ matlab matrix mex eigen


【解决方案1】:

问题出在打印代码中,应该是:

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

那么,就不需要复制向量和矩阵了。例如,result1 是无用的,因为您可以使用result1Eigen.data() 获得指向存储在result1Eigen 中的数据的原始指针。同样的,你可以直接将weight_matrix.transpose()分配给Map&lt;MatrixXd&gt;(result3,...),我看不出well的用途。

最后,如果在编译时确实知道大小,那么最好使用Matrix&lt;double,6,1&gt; 而不是VectorXdMatrix&lt;double,6,6&gt; 而不是MatrixXd。您可以期待显着的加速。

【讨论】:

  • 可爱的 Ggael,它完成了这项工作,我仍然不相信我在打印 H 时会错过所有 (i) 元素的迭代。案例大小将是已知的。但我会动态分配这些矩阵的大小。非常感谢您的提示。真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多