2013-10-14 2 views
13

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

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

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, 0,9} и с = {0, 0,5, 1, -2, -5}. Выход будет:

A: 
     0 
B: 
    -5.0000 

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

+2

Не используйте оператор <<, если вы не собираетесь инициализировать все элементы сразу (например. А << 4 << 5 << 9). Либо используйте цикл для установки элементов, либо используйте более эффективный метод конструктора aux_mem, описанный Мартином J ниже. – mtall

+0

Да, я понял, что << оператор - это не путь. aux_mem работал. Благодаря! –

ответ

7

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

От the armadillo doc:

  • коврика (aux_mem *, n_rows, n_cols, copy_aux_mem = true, strict = true)

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

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

  • мат (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); 
+0

Как использовать список инициализации C++ 11? – qed

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