Вопрос новичка, касающийся манипуляции с подматрицами с помощью BOOST uBLAS - PullRequest
2 голосов
/ 04 августа 2011

Это меня озадачивало несколько часов, так что, может быть, кто-то здесь может помочь.Я пытаюсь перевести следующую простую программу Matlab на C ++, используя uBLAS:

>> R = eye(4);
>> R(:,3) = R(:,4);
>> R

R =

     1     0     0     0
     0     1     0     0
     0     0     0     0
     0     0     1     1

Это моя попытка, но она не работает:

#include <iostream>

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

using namespace boost::numeric::ublas;

int main () 
{
    matrix<double> Idmx = identity_matrix<double> (4);
    project (Idmx, range (0, 4), range (2, 3)) = project (Idmx, range (0, 4), range (3, 4));

    std::cout << Idmx << std::endl;

    int temp;
    std::cin >> temp;
}

Вывод:

[4,4]((1,0,0,0),(0,1,0,0),(0,0,0,0),(0,0,1,1))

Я не понимаю, почему в третьем ряду теперь все нули.Может кто-нибудь подсказать мне решение?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

Пример:

MATLAB

>> m = [0 1 2 3 4; 5 6 7 8 9; 10 11 12 13 14; 15 16 17 18 19]
m =
     0     1     2     3     4
     5     6     7     8     9
    10    11    12    13    14
    15    16    17    18    19
>> m(:,3) = m(:,4)
m =
     0     1     3     3     4
     5     6     8     8     9
    10    11    13    13    14
    15    16    18    18    19

C ++ / uBLAS

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

namespace bnu = boost::numeric::ublas;

int main()
{
    /* create and fill matrix */
    bnu::matrix<double> m(4,5);
    for (unsigned i = 0; i < m.size1(); ++i)
        for (unsigned j = 0; j < m.size2(); ++j)
            m(i,j) = m.size2()*i + j;

    /* All the following are equivalent */

    // indexing (i,j)
    for(unsigned i = 0; i < m.size1(); ++i)
        m(i,2) = m(i,3);

    // column
    bnu::column(m,2) = bnu::column(m,3);

    // project+range
    bnu::project(m, bnu::range(0,m.size1()), bnu::range(2,3)) = bnu::project(m, bnu::range(0,m.size1()), bnu::range(3,4));

    /* print matrix */
    std::cout << m << std::endl;

    return 0;
}

Выход:

[4,5]((0,1,3,3,4),(5,6,8,8,9),(10,11,13,13,14),(15,16,18,18,19))
0 голосов
/ 20 ноября 2013

Оба результата в точности совпадают.В обоих случаях вы копируете четвертый столбец в третий.Поскольку четвертый столбец [0;0;0;1], третий столбец также будет [0;0;0;1] после этого.

...