2016-03-04 131 views
2

在我正在研究的项目中的一个函数中,我需要在除以给定数字时查找我的特征库矩阵的每个元素的其余部分。这里是Matlab相当于我想要做的:特征矩阵库系数模运算

mod(X,num) 

其中X是除数矩阵和num是除数。

实现此目的的最简单方法是什么?

+0

退房http://arma.sourceforge.net/他们与你想和什么方法做一个好的图书馆从matlab转换的指南。 – Jacobr365

+0

我过去使用过犰狳,但我想尝试Eigen这个项目。 Eigen有没有办法做到这一点? – pincir

+0

不是我所知道的。您可以使用特征中的其他函数编写自己的mod函数,以获得与mod() – Jacobr365

回答

2

可以使用C++ 11拉姆达与unaryExpr

MatrixXi A(4,4), B; 
A.setRandom(); 
B = A.unaryExpr([](const int x) { return x%2; }); 

或:

int l = 2; 
B = A.unaryExpr([&](const int x) { return x%l; }); 
+0

谢谢,那有效:) – pincir

0

为了完整起见,另一种解决方案将是:

  1. 变换X到一个特征数组(用于coeffwise操作),
  2. 应用模数fo rmula a%b = a - (b * int(a/b))

C++代码,返回一个本征数组:

auto mod_array = X.array() - (num * (X.array()/num)); 

C++代码来获得的矩阵:

auto mod_matrix = (X.array() - (num * (X.array()/num))).matrix(); 

注意,括号是重要,特别是在(X.array()/num)作为本征将优化(num * X.array()/num)X.array()这不是我们所期望的。

特征数组的第一个版本比使用unaryExpr的版本更快。 矩阵的第二个版本与unaryExpr的版本大致相同。

如果X包含浮点数,则需要在(X.array()/num)X.array()为int