Подтвердить что ты не робот

Armadillo С++: инициализация матрицы из массива

Я новичок в использовании armadillo и не могу получить следующее, несмотря на попытки/поиск совсем немного.

Есть два огромных (динамических) массива (не векторы), для которых мне нужно выполнить корреляцию. Я решил использовать армадильо для этого. Я понимаю, как инициализировать arma:: mat, используя векторы, но могу ли я использовать массивы для этого? Я не понимаю, что я не вижу упоминания в документации . Я стараюсь избегать использования векторов по причинам внутреннего дизайна. Я попытался вручную инициализировать каждый элемент, используя массивы образцов (как тупую, но отправную точку). Что-то вроде следующего кода не будет работать.

using namespace std;
using namespace arma;   

mat A(SIZE, 1), B(SIZE, 1);

for(int i = 0; i < SIZE; i++)
{
    A << v[i] << endr;
    B << c[i] << endr;
}

cout << "A: " << endl;
A.print();
cout << "B: " << endl;
B.print();

Для входных массивов v = {1, 2, 0, -1,.9} и c = {0,.5, 1, -2, -5}. Выход будет:

A:
        0
B:
  -5.0000

что понятно. Любая работа для инициализации arma:: mat или arma:: colvector с массивами? Спасибо заранее!

4b9b3361

Ответ 1

Предполагая, что ваши массивы v и c являются двойными массивами, вы можете просто использовать конструкторы памяти aux:

Из armadillo doc:

  • mat (aux_mem *, n_rows, n_cols, copy_aux_mem = true, strict = true)

    Создайте матрицу, используя данные из записываемой вспомогательной памяти. По умолчанию матрица выделяет свою собственную память и копирует данные из вспомогательной памяти (для обеспечения безопасности). Однако, если для параметра copy_aux_mem установлено значение false, вместо этого матрица будет непосредственно использовать вспомогательную память (то есть без копирования). Это быстрее, но может быть опасно, если вы не знаете, что делаете!

Строгая переменная вступает в силу только в том случае, если для параметра copy_aux_mem установлено значение false (т.е. матрица напрямую использует вспомогательную память). Если для strict задано значение true, матрица будет привязана к вспомогательной памяти для ее времени жизни; количество элементов в матрице не может быть изменено (прямо или косвенно). Если для параметра strict установлено значение false, матрица не будет привязана к вспомогательной памяти для ее времени жизни, т.е. Размер матрицы может быть изменен. Если запрошенное количество элементов отличается от размера вспомогательной памяти, будет выделена новая память, и дополнительная память больше не будет использоваться.

  • mat (const aux_mem *, n_rows, n_cols)

Создайте матрицу, скопировав данные из дополнительной памяти, доступной только для чтения.

Это означает, что вы можете создавать свои матрицы, скопировав исходные данные следующим образом:

mat A_Copy(v, SIZE, 1);
mat B_Copy(c, SIZE, 1);

Или вы можете повторно использовать память, которую вы уже выделили для своих массивов, для создания матриц только для чтения, например:

mat A_InPlace(v, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true);
mat B_InPlace(c, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true);

Это становится еще проще, если вы используете векторы

vec A_Vec_Copy(v, SIZE);
vec B_Vec_Copy(c, SIZE);

Или:

vec A_Vec_InPlace(v, SIZE, false, true);
vec B_Vec_InPlace(c, SIZE, false, true);