2017-03-10 1 views
0

Est-il possible de créer une matrice de 9x9 où la « diagonale » est une autre matrice et le reste sont des zéros, comme ceci:Eigen: matrice zéro avec une matrice plus petite que les « diagonales »

5 5 5 0 0 0 0 0 0 
5 5 5 0 0 0 0 0 0 
5 5 5 0 0 0 0 0 0 
0 0 0 5 5 5 0 0 0 
0 0 0 5 5 5 0 0 0 
0 0 0 5 5 5 0 0 0 
0 0 0 0 0 0 5 5 5 
0 0 0 0 0 0 5 5 5 
0 0 0 0 0 0 5 5 5 

d'un plus petit matrice 3x3 répété:

5 5 5 
5 5 5 
5 5 5 

Je suis au courant de la fonction Replicate mais qui se répète partout dans la matrice et ne maintient pas les zéros. Y a-t-il un moyen intégré de réaliser ce que je cherche?

Répondre

1

L'une des façons d'y parvenir consiste à utiliser des blocs où .block<3,3>(0,0) est un bloc 3x3 commençant à 0,0. (Note: Votre IDE pourrait marquer cette ligne comme une erreur, mais il compiler et exécuter)

for (int x=0, x<3, x++){ 
    zero_matrix.block<3,3>(x*3,x*3) = five_matrix; 
} 
0

Vous pouvez utiliser le module produit de kronecker (non pris en charge) pour que:

#include <unsupported/Eigen/KroneckerProduct> 
int main() 
{ 
    Eigen::MatrixXd A = Eigen::kroneckerProduct(Eigen::Matrix3d::Identity(), Eigen::Matrix3d::Constant(5)); 
    std::cout << A << '\n'; 
}