2016-03-13 2 views
0

Я пытаюсь инициализирует Armadillo разреженный matriix sp_mat в MPI следующим образом:Использование Армадилла разреженных матриц в MPI

if(rank==0) 
{ // some code for locations, values 
    sp_mat X(locations,values) 
} 
// this is where I want to use X 
if(rank==0) 
    some_fun(X) 

Как вы можете видеть, Armadillo конструктор является локальным для if block и как таковой не может использовать его после того, как if block. Положив тот же вопрос по-другому:

extern sp_mat X 
if(rank==0) 
{ // some code for locations, values 
    sp_mat X(locations,values) 
} 
// this is where I want to use X 
if(rank==0) 
    some_fun(X) 

extern sp_mat X Использование Перед if block также не помогает (я получил неопределенную ссылочную ошибку).
Как инициализировать X и повторно использовать его после?

+0

ли это работать? из более раннего вопроса –

+0

№ Это не сработало. – chandresh

+1

** декларация ** из 'X' является локальной ветвью if, поэтому вы не можете использовать' X' вне этой ветви. Прочтите некоторые учебники/книги на C++ ... –

ответ

1

использование (смарт) указатели:

std::unique_ptr<sp_mat> X; // or std::shared_ptr<sp_mat> or sp_mat* 
if (rank == 0) { 
    // some code for locations and values  
    X = std::unique_ptr<sp_mat>(new sp_mat(locations, values)); 
} 
... 
if (rank == 0) 
    some_fun(*X); 
+0

FYI, я знаю основы MPI. Теперь мой комментарий к 1-му решению: использование пустого конструктора 'sp_mat X' недопустимо для' пакетной вставки' через использование местоположений и значений (см. [Sp_mat] (http://arma.sourceforge.net/docs.html# SpMat)). Мне нужно посмотреть на ваше второе решение. Чтобы ответить на ваш вопрос, я хочу загрузить X только для процесса «root», и я знаю, что 'X' является только локальным для root. Это то, чего я хочу. – chandresh

+0

@chandresh Хорошо, я был смущен, так как вы заполняете значения 'X' только в корневом процессе, но затем вы используете' X' во всех процессах (через 'some_fun()'). –

+0

Нет, я использую 'X' только в корневом процессе. – chandresh

1

Вместо того, с помощью указателя трюков, намного чище std::move() от C++ 11 могут быть использованы:

sp_mat X; 

if(rank==0) 
{ // some code for locations, values 
    X = std::move(sp_mat(locations,values)); 
} 
+0

Спасибо, hbrerkere. – chandresh

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