如何在C ++中使用特征库进行矩阵分割

时间:2018-01-14 06:25:59

标签: c++ matlab eigen3

我做了MATLAB代码并且必须执行

B3=abs(B2/max(B2));

其中B2181 x 238矩阵,max(B2)应该为我提供一个1 x 238矩阵,其中包含每列中的最大值,B3应为{ {1}}的矩阵。使用Eigen库的等效181x1代码应该是什么?请帮忙。 在修改我的代码时,用更简单的维度说2 x 2矩阵

C++

但我无法执行此代码。

hp @ hp-HP-Notebook:〜/ beamforming / programs / eigen_prog $ g ++ mm_t.cpp -o mm_t

hp @ hp-HP-Notebook:〜/ beamforming / programs / eigen_prog $ ./mm_t mm_t:/usr/local/include/eigen3/Eigen/src/Core/CwiseBinaryOp.h:110:Eigen :: CwiseBinaryOp :: CwiseBinaryOp(const Lhs&,const Rhs&,const BinaryOp&)[with BinaryOp = Eigen ::内部:: scalar_quotient_op; LhsType = const Eigen :: ArrayWrapper&gt ;; RhsType = const Eigen :: ArrayWrapper&gt ;; Eigen :: CwiseBinaryOp :: Lhs = Eigen :: ArrayWrapper&gt ;; Eigen :: CwiseBinaryOp :: Rhs = Eigen :: ArrayWrapper>]:断言`aLhs.rows()== aRhs.rows()&& aLhs.cols()== aRhs.cols()'失败。 中止(核心倾销)

知道什么是错的? 我在MATLAB命令窗口中执行了简单的操作,以简化我想要的输出。

  
    

M = [4,12; 6,8]

  

m =

//problem
#include <iostream>
#include<complex.h>
#include <eigen3/Eigen/Dense>
#include <eigen3/Eigen/Core>

using namespace Eigen;
using namespace std;
using Eigen::MatrixXd;

int main()
{
    MatrixXd A(2,2);MatrixXd B(2,1);MatrixXd C(1,2);
    A<<4,12,
       6,8;
            C=A.colwise().maxCoeff();
        //B=(A*(1.0/C)).cwiseAbs();
             B=A.array()/C.array();
   cout << "The solution is A :\n" << B.cwiseAbs()<< endl;

    return 0;
}
  
    

MAX(米)

  

ans =      6 12

  
    

ABS(米/最高(M))

  

ans =

 4    12
 6     8
  
    

  

我长期坚持这个问题。请帮忙。

1 个答案:

答案 0 :(得分:0)

我将B3=abs(B2/max(B2))解释为以下内容。

  • b = max(B2)是一个行向量,包含B2各列的最大元素。

  • q = B2/b表示超定线性方程q b = B2的最小二乘解。 (nrow个独立问题,其中nrowB2的行数。这个等式相当于b^T q^T = B2^T,其中^T是我的转置符号,我猜这个形式在许多库中更常用。

  • abs(q)表示q的元素值绝对值。

因此,所需的结果是x以下。也许

#include <iostream>
#include <eigen3/Eigen/Dense>
#include <eigen3/Eigen/Core>

using namespace Eigen;
using namespace std;

int main()
{
  MatrixXd A(2,2), Atr(2,2);
  VectorXd b(2), x(2);
  A<<4,12,
    6,8;
  cout << "A :\n" << A << endl;

  Atr=A.transpose();
  cout << "Atr :\n" << Atr << endl;

  b=A.colwise().maxCoeff();
  cout << "b :\n" << b << endl;

  x = b.colPivHouseholderQr().solve(Atr).cwiseAbs();
  cout << "x :\n" << x << endl;

  return 0;
}

输出

A :
 4 12
 6  8
Atr :
 4  6
12  8
b :
 6
12
x :
0.933333
0.733333

比照

https://eigen.tuxfamily.org/dox/group__LeastSquares.html

  • 以下是基于对Matlab中A/v定义的误解而得出的旧答案。

可能排在队列中的结果B3对应于下面的向量x

#include <iostream>
#include <eigen3/Eigen/Dense>
#include <eigen3/Eigen/Core>

using namespace Eigen;
using namespace std;

int main()
{
  MatrixXd A(2,2);
  VectorXd b(2), x(2);
  A<<4,12,
    6,8;
  cout << "A :\n" << A << endl;

  b=A.colwise().maxCoeff();
  cout << "b :\n" << b << endl;

  x = A.colPivHouseholderQr().solve(b).cwiseAbs();
  cout << "x :\n" << x << endl;

  return 0;
}

CF

http://eigen.tuxfamily.org/dox/group__TutorialLinearAlgebra.html

根据我在matlab中对max(A)的误解,以下是错误的答案。

在Matlab中,max(A)是矩阵A的最大元素,abs(A)返回一个矩阵,它取相应元素A的绝对值。 因此,如果B2是特征的Matrix对象,也许

B2=(B2*(1.0/B2.maxCoeff())).cwiseAbs()

比照 https://www.mathworks.com/help/matlab/ref/abs.html?searchHighlight=abs&s_tid=gn_loc_drop http://eigen.tuxfamily.org/dox/group__QuickRefPage.html