C ++ Armadillo: массивы индексов из 2D-матрицы - PullRequest
0 голосов
/ 29 ноября 2018

Я родом из Питона.У меня есть проблема линейной алгебры в C ++, и я решил использовать Armadillo для этого, так как он объявляет себя похожим на MATLAB, таким образом похожим на SciPy.

Я ищу способзаполните две матрицы, одну со строками, одну со столбцами 2D-матрицы заданной формы (в Python это будет numpy.indices).

Например, если у меня 4 строки / 3Форма матрицы столбцов, что мне нужно, это построить матрицу строк:

0 0 0
1 1 1
2 2 2
3 3 3

и матрицу столбцов:

0 1 2
0 1 2
0 1 2
0 1 2

, чтобы впоследствии выполнить некоторые вычисления.

Это похоже на C ++ Armadillo Generate Indices uvec данного vec или матрицы без зацикливания , но с матрицей вместо 1D-вектора.

Есть ли способ сделать это безслишком много циклов?Я знаю о linspace для заполнения вектора, но я бы предпочел не зацикливаться на связке векторов, чтобы объединить их в матрицу.Я только начинаю с Armadillo, и я пока не очень осведомлен о его возможностях (в основном, у меня есть только матричные продукты и инверсия).

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Хотя данный ответ генерирует запрошенные матрицы, ОП запросил решение, не использующее циклы.Этот ответ использует regspace и repmat и, возможно, концептуально проще:

#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;

int main (int argc, char const* argv[])
{
    ivec a_col = regspace<ivec>(0, 3);
    imat A = repmat(a_col, 1, 3);

    irowvec b_row = regspace<irowvec>(0,2);
    imat B = repmat(b_row, 4, 1);

    cout << A << endl;
    cout << B << endl;
    return 0;
}

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

0 голосов
/ 29 ноября 2018

@ баклажан.Библиотека armadillo очень полезна для научных вычислений и проста в использовании.Я бы посоветовал достать семью со своей страницей документации Документация броненосца

Что касается вашей конкретной проблемы, вот решение, которое я предлагаю:

#include<iostream>
#include<armadillo>

using namespace std;
using namespace arma;

int main(int argc, char **argv)
{
    // Create two matrices A and B of shape 4x3 filled with zeros
    imat A = zeros<imat>(4, 3);
    imat B = zeros<imat>(4, 3);

    // Fill each row
    for(int i=0; i < 4; i++)
    {
        A.row(i) = i * ones<ivec>(3).t();  // 
    }

    // Fill each column
    for(int i=0; i < 3; i++)
    {
        B.col(i) = i * ones<ivec>(4);
    }
    cout << "A = \n" << A << endl;
    cout << "B = \n" << B << endl;

    return 0;
}

Компиляция выглядит так:это на моих компьютерах (Mac OSX и Ubuntu):

g++ -std=c++11 -O2 `pkg-config --cflags --libs armadillo` testArmadillo.cpp -o a.out

Затем мы можем запустить исполняемый файл, просто набрав:

./a.out

и получим следующее:

A =
    0        0        0
    1        1        1
    2        2        2
    3        3        3

B =
    0        1        2
    0        1        2
    0        1        2
    0        1        2

Для получения дополнительной информации о imat , ivec , см. imat и ivec

...