2015-03-03 1 views
0

Мне нужно инициализировать матрицу Armadillo массивом двойников. Я нашел этот конструктор в оригинальной документации:Armadillo и C++ - Инициализация матрицы с помощью 2D-массива

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

, и я нашел вопрос об этом здесь на SO:

armadillo C++: matrix initialization from array

Проблема заключается в том, оказывается, что конструктор работает только для инициализации одномерными массивами, а не 2D. Если я пытаюсь его использовать так:

double **matrix = new double *[block_size]; 
for(int i = 0; i < block_size; i++) { 
    matrix[i] = new double[block_size]; 
} 

arma::mat arma_matrix(&matrix[0][0], matrix_size, matrix_size, true, true); 

cout << "am: " << arma_matrix[1][0] << endl; 

Я получаю ошибку:

fined_grain:103/init_function: In function ‘void place_user_fn_103(ca::Context&, ca::TokenList<double>&)’: 
fined_grain:103/init_function:61:42: error: invalid types ‘double[int]’ for array subscript 

Итак, что идеальный способ для инициализации матрицы Arma с 2D-массив? Я предпочитаю самое быстрое решение, потому что мне нужно использовать большие матрицы.

+0

@ user3670482 - в моем опыте, Библиотека ускорения матрицы довольно примитивна по сравнению с Armadillo – mtall

+0

@ user3670482 К сожалению, я должен использовать Armadillo. Тем не менее, спасибо за ваш совет ;-) – Eenoku

+0

@mtall Вы пробовали использовать таблицу Boost с шаблонами C++ 11? Возможно, вы с этим справитесь. –

ответ

1

Я быстро взглянул на armadillo library documentation, и я вижу следующие проблемы.

  1. Аргумент вы передаете к arma_matrix синтаксически правильно, но неправильно. Вы должны использовать:

    double *matrix = new double [block_size*block_size]; 
    arma::mat arma_matrix(matrix, block_size, block_size, true, true); 
    
  2. синтаксис для доступа к элементам является:

    cout << "am: " << arma_matrix(1, 0) << endl; 
    

    Вы также можете использовать:

    int row = 1; 
    int col = 0; 
    cout << "am: " << arma_matrix[row*block_size+col] << endl; 
    
+0

Чтобы избежать копирования памяти, измените 'arma :: mat arma_matrix (matrix, block_size, block_size, true, true)' to 'arma :: mat arma_matrix (matrix, block_size, block_size, false, true) ', т.е. 4-й аргумент изменен на 'false'. Это быстрее, но см. Оговорки, описанные в [связанных примечаниях к документации] (http://arma.sourceforge.net/docs.html#adv_constructors_mat) (например, потому что вы теперь используете память напрямую, теперь вы быть ответственным за освобождение памяти, обработку псевдонимов и т. д.). – mtall