2016-03-04 126 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