Прежде всего позвольте мне извиниться за мое довольно базовое понимание предмета и длину этого вопроса. Я работаю в проекте, который включает в себя 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;
безопасный способ сделать это? (Я не жму). Какой лучший способ продолжить?
Задача ещё не решена.
Других решений пока нет …