2010-06-25 24 views
1

Я должен сам размножить матрицу, пока матрица в какой-то степени не будет равна одной из предыдущих матриц. Тогда мне нужно получить значения степеней, в которых матрицы равны. Количество строк и столбцов равно. Матрица хранится в двумерном массиве. Значения равны 0 или 1. Каков наилучший способ проверить равенство с предыдущими матрицами? Я пытался использовать vector для хранения матриц:Сравнение умножения матриц

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

, но я получил ошибку cannot convert from 'const int [5][5]' to 'int [5][5]'.

Ожидание совета.

+0

Звучит как домашнее задание. –

+0

Возможно, вам стоит опубликовать фрагмент кода, который вызывает ошибку компиляции. –

+0

Под «в некоторой степени» вы подразумеваете поворот? (Или я просто забыл термин?) Являются ли они всегда квадратными матрицами размером 5 × 5? – Rup

ответ

3

Если вы можете использовать boost, посмотрите на прирост Matrix класс:

Это, кажется, отсутствует в == оператора, но это легко добавить:

#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; 
} 

и используется следующим образом:

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

«operator ==' отсутствует, потому что сравнение равенства плавающей запятой (цель библиотеки) практически не имеет смысла. В любом случае существует 'ublas :: detail :: equals' (слабое равенство), которое безопаснее использовать, поскольку оно допускает пороговые значения. Например, 'ublas :: detail :: equals (m1, m2, 1.e-6, 0.)'. Или если один настаивает на 'template bool operator == (M1 const & m1, M2 const & m2) {return detail :: equals (m1, m2, std :: numeric_limits :: epsilon(), std :: numeric_limits :: min());} '(Также выбрасывает, если размеры несовместимы, что может быть, возможно, не желаемое) – alfC

+1

в новой версии gcc (версия> 5 и/или C++ 11), ключевое слово 'typename' является обязательным, и вышеприведенная функция должна быть скорее:' template bool operator == (M1 const & m1, M2 const & m2) {return detail :: equals (m1, m2, std :: numeric_limits :: epsilon(), std :: numeric_limits :: min()); } При использовании numeric_limits обратите внимание на ключевое слово 'typename'. –

1

Если вы хотите сделать это с помощью vector, вы, вероятно, захотите vector < vector <int> >, то есть вектор векторов ints (т. вид двумерного вектора).

vector<int[5][5]> будет (если это сработает) объявить вектор 2-мерного 5x5- int -arrays.

Смежные вопросы