увеличить объем сжатой матрицы - PullRequest
1 голос
/ 20 сентября 2010

Усиление ublas::compressed_matrix должно выделять место только для ненулевых элементов.Но в следующем примере я получаю странные результаты.

#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/io.hpp>

using namespace std;
using namespace boost::numeric::ublas;

int main () {
{
    compressed_matrix<double,row_major> m (4, 4, 2*2);
    cout << sizeof(m) << "\n";    // prints 56
    cout << m << std::endl;
}

{
    matrix<double> m (4, 4);
    cout << sizeof(m) << "\n";    // prints 20
    cout << m << std::endl;
}

return 0;
}

Почему ublas::matix принимает только 20 байт для 4x4 matrix (вместо 8*4*4=128 байт), тогда как ublas::compressed_matrix с 2*2=4 ненулевых элементов занимает 56 байтов (вместо 4*8=32 байтов)?

Меня также смутило, как указать расположение ненулевых элементов в ublas::compressed_matrix.Что произойдет, если я попытаюсь сохранить больше, чем количество ненулевых элементов, установленных в конструкторе?

Пожалуйста, помогите уточнить.

Ответы [ 3 ]

4 голосов
/ 20 сентября 2010

sizeof () - оператор времени компиляции, который смотрит только на прямой размер объекта, а не на какие-либо выделения, которые объект может сделать во время выполнения.Например:

class SizeTest
{
public:

    char* m_pData;

    SizeTest()
    {
        m_pData = new char[1000];
    }
};

int main (void)
{
    SizeTest Test;
    cout << sizeof(Test) << "\n";  //Probably prints 4 depending on your system
    return 0;
}
1 голос
/ 11 мая 2014

sizeof() не знает выделения памяти во время выполнения.Чтобы полностью понять вопрос, вам нужно знать реализацию ublas::matix и ublas::compressed_matrix, у них обоих есть базовый массив хранения (по умолчанию ublas::::unbounded_array, и вы можете выбрать другие, указав параметр шаблона).В отличие от ublas::matix, ublas::compressed_matrix хранит только ненулевые элементы матрицы.

Меня также смутило, как мне указать расположение ненулевых элементов в ublas ::ressed_matrix.

использовать итератор.

Что произойдет, если я попытаюсь сохранить больше, чем количество ненулевых элементов, установленных в конструкторе?

Я не понимаю, как вы храните больше, чем количество ненулевых элементов, установленных вконструктор, если вы имеете в виду третий параметр, это просто предварительно выделенный размер базового массива хранения.

Например:

#include <boost/numeric/ublas/matrix_sparse.hpp>
#include <boost/numeric/ublas/storage.hpp>

namespace ublas = boost::numeric::ublas;

int main()
{

    ublas::compressed_matrix<double> m(4, 4, 2*2);
    m(1,2) = 3.5;
    std::cout << m.value_data().size() << '\n';

    typedef ublas::compressed_matrix<double>::iterator1 it1_t;
    typedef ublas::compressed_matrix<double>::iterator2 it2_t;

    for (it1_t it1 = m.begin1(); it1 != m.end1(); it1++)
    {
      for (it2_t it2 = it1.begin(); it2 != it1.end(); it2++)
      {
        std::cout << "(" << it2.index1() << "," << it2.index2() << ") = ";
        std::cout << *it2 << std::endl;
      }
    }


    {
        ublas::matrix<double> m(4,4);
        std::cout << m.data().size() << '\n';
    }

    {
        ublas::compressed_matrix<double> m(4, 4, 5*5);
        std::cout << m.value_data().size() << '\n';
    }

}
0 голосов
/ 11 мая 2014

Память выделяется при вызове сжатого конструктора матрицы, когда дана информация о размерах и количестве ненулевых элементов. А для типа матрицы память, вероятно, будет выделяться динамически позже, когда вы вставляете элементы в матрицу.

...