2010-06-25 10 views
1

Je dois multiplier une matrice par elle-même jusqu'à ce que la matrice dans un certain degré ne soit pas égale à l'une des matrices précédentes. Ensuite, j'ai besoin d'obtenir les valeurs des degrés dans lesquels les matrices sont égales. Le nombre de lignes et de colonnes est égal. La matrice est stockée dans un tableau à deux dimensions. Les valeurs sont 0 ou 1. Quelle est la meilleure façon de vérifier l'égalité avec les matrices précédentes? J'ai essayé d'utiliser vector pour stocker des matrices:Compare la multiplication des matrices

vector<int[5][5]> m; 

mais je suis une erreur cannot convert from 'const int [5][5]' to 'int [5][5]'.

En attente d'un conseil.

+0

Cela ressemble à des devoirs. –

+0

Vous devez probablement publier le fragment de code qui provoque l'erreur de compilation. –

+0

Par «dans une certaine mesure» voulez-vous dire rotation? (Ou ai-je oublié le terme?) Est-ce qu'il s'agit toujours de matrices carrées de 5x5? – Rup

Répondre

3

Si vous pouvez utiliser boost, regardez le coup de pouce Matrix classe:

Il semble manquer un opérateur ==, mais il est facile d'ajouter:

#include <iostream> 
#include <boost/numeric/ublas/matrix.hpp> 
#include <boost/numeric/ublas/io.hpp> 

using namespace boost::numeric::ublas; 

template<typename T> 
bool operator==(const matrix<T>& m, const matrix<T>& n) 
{ 
    bool returnValue = 
    (m.size1() == n.size1()) && 
    (m.size2() == n.size2()); 

    if (returnValue) 
    { 
    for (unsigned int i = 0; returnValue && i < m.size1(); ++i) 
    { 
     for (unsigned int j = 0; returnValue && j < m.size2(); ++j) 
     { 
     returnValue &= m(i,j) == n(i,j); 
     } 
    } 
    } 
    return returnValue; 
} 

Et utilisé comme ceci:

int main() 
{ 

    matrix<double> m (3, 3); 
    for (unsigned int i = 0; i < m.size1(); ++ i) 
    { 
    for (unsigned int j = 0; j < m.size2(); ++ j) 
    { 
     m (i, j) = 3 * i + j; 
    } 
    } 
    std::cout << m << std::endl; 

    matrix<double> n (3, 3); 

    std::cout << (m == n) << std::endl; 
    std::cout << (m == m) << std::endl; 
} 

[Code]

+1

L'opérateur '==' est manquant parce que la comparaison d'égalité de virgule flottante (cible de la bibliothèque) a peu ou pas de sens. Dans tous les cas, il y a un 'ublas :: detail :: equals' (faible égalité) qui est plus sûr à utiliser car il permet des seuils. Par exemple 'ublas :: detail :: est égal à (m1, m2, 1.e-6, 0.)'. Ou si l'on insiste sur 'template opérateur booléen == (M1 const & m1, M2 const & m2) {return detail :: est égal à (m1, m2, std :: numeric_limits :: epsilon(), std :: numeric_limits :: min());} '(Lance également si les tailles sont incompatibles, ce qui peut-être ou pas un comportement désiré) – alfC

+1

dans le nouveau langage gcc (version> 5 et/ou C++ 11), le mot clé 'typename' est obligatoire, et la fonction ci-dessus devrait plutôt être:' template opérateur booléen == (M1 const & m1, M2 const & m2) {return detail :: est égal à (m1, m2, std :: numeric_limits :: epsilon(), std :: numeric_limits :: min()); } Vous noterez le mot-clé 'typename' lors de l'utilisation de numeric_limits. –

1

Si vous voulez le faire avec vector, vous voulez probablement vector < vector <int> >, c'est-à-dire un vecteur de vecteurs d'ints (c.-à-d. type de vecteur bidimensionnel).

vector<int[5][5]> serait (si cela a fonctionné) déclarer un vecteur de 2 dimensions 5x5-int -arrays.