Динамические переменные размера в броненосце (C ++)

Прежде всего позвольте мне извиниться за мое довольно базовое понимание предмета и длину этого вопроса. Я работаю в проекте, который включает в себя arma::field 3D матриц или arma::Cube(Ы). Размер поля постоянен, но не внутренние размеры отдельных кубов. Давайте определим этот тип как:

typedef arma::field< arma::Cube<cx_double> > MPO;

Следующие функции инициализируют переменную MPO со всеми элементами Cube, установленными в нули.

// Initializes MPO with N sites and open boundary conditions (OBC)
MPO initMPO(int N_in,int chi_in, int d_in){

MPO MPOnull(N_in);
for(uword l=0; l<N_in ; ++l){ // osc. id
if( l == 0  ){
MPOnull.at(l) = zeros< arma::Cube<cx_double> >(1  ,chi_in,d_in);
} else if(l == N_in-1) {
MPOnull.at(l) = zeros< arma::Cube<cx_double> >(chi_in,1  ,d_in);
} else {
MPOnull.at(l) = zeros< arma::Cube<cx_double> >(chi_in,chi_in,d_in);
}

}
return MPOnull;

В алгебре переменных MPO суммирование в MPO приводит к одной переменной MPO, чьи внутренние кубы имеют больший размер.

Если обновление определенного MPO требует много сумм, размеры могут увеличиваться бесконечно, поэтому требуется сжатие SVD (здесь не показано). Допустим, у нас есть начальный MPO;

MPO myMPO = randMPO(N);

for(uword i=0;i<L; ++i){
MPO randomterm = randMPO(N); // create a random MPO term
myMPO = sumMPO(myMPO,randomterm); // sum the term, increasing the dimension of myMPO

if(int(i) % 5){ // truncate the dimensions of the inner Cubes every 5 steps
myMPO = truncateMPO(myMPO,2);
}
}

где randMPO(N) функция создает MPO размера N в области комплексных чисел. Обратите внимание, что кубики внутри myMPO увеличение в размере с каждой суммой. Мы называем функцию truncateMPO(chi) который усекает размер этих 3d матриц, используя схему развертки SVD.

Вопрос 1

Безопасно ли суммировать (или усекать) myMPO без промежуточной переменной?

вопрос 2

Должен ли я явно изменить размеры внутренних кубов myMPO каждый раз, когда они меняются в размере или делает оператор = заботится об этом?

Вопрос 3

Если у меня есть два MPO, M1 и M2 с разными размерами внутреннего куба (будучи внутренними кубами M2 большего размера, чем M1), и в какой-то момент я хочу, чтобы M2 был равен M1, уменьшив, таким образом, его размеры, M2=M1; безопасный способ сделать это? (Я не жму). Какой лучший способ продолжить?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]