Конструктор (SpMat_meat.hpp: 231) вы используете
template<typename T1, typename T2>
inline SpMat(const Base<uword,T1>& locations, const Base<eT,T2>& values, const bool sort_locations = true);
заполняет разреженную матрицу с копий значений в values
.
Я понимаю, что вы обеспокоены тем, что вы будете запускать из памяти, и если вы держите loc
, val
и X
отдельно вы в основном имеют две копии тех же данных, занимая в два раза больше памяти, чем на самом деле необходимости (это действительно то, что происходит в вашем фрагменте кода), поэтому я попытаюсь сосредоточиться на решении этой проблемы и дать вам несколько вариантов:
1) Если вы в порядке, сохраняя две копии данных на короткое время, самым простым решением является до динамически выделить loc
и val
и удалить их после инициализации X
int main(int argc, char**argv){
umat* ploc;
vec* pval;
load_data(*ploc,*pval);
// at this point we have one copy of the data
sp_mat X(*ploc,*pval);
// at this point we have two copies of the data
delete ploc;
delete pval;
// at this point we have one copy of the data
return 0;
}
Конечно, вы можете использовать безопасные указатели вместо стилей C, но вы получите эту идею.
2) Если вы совершенно не хотите иметь две копии данных в любое время, я хотел бы предложить вам изменить ваш load_data
подпрограмму последовательно загружать значения по одному и сразу вставить их в X
void load_data(umat &locations, vec& values, sp_mat& X){
// fill up locations and values one by one into X
}
других вариантов бы я) использовать перемещение семантику непосредственно хода значения в val
в X
или б) непосредственно использовать память, выделенную для val
как память для X
, похожей на передовой конструктор для матриц
Mat(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem = true, const bool strict = false)
Оба варианта, однако, потребуют изменений на уровне библиотеки armadillo, поскольку такая функциональность еще не предоставлена для разреженных матриц (до сих пор существует только простой механизм перемещения). Было бы неплохо запросить эти функции у разработчиков!
он должен быть записан в документах библиотеки. если нет, 1. поставьте точку останова перед load_data, проверьте размер памяти, используемый вашим исполняемым файлом. 2. Загрузите значительно большие данные и найдите изменение размера памяти. 3.запустите строку sp_mat и посмотрите, приближается ли скорость увеличения памяти к шагу secon. если это то же самое удалить, иначе нет. Но, я считаю, есть лучший способ проверить это :) – seleciii44
Почему вы не смотрите на исходный код Armadillo для класса _SpMat_? 'include/armadillo_bits/SpMat_meat.hpp' – hbrerkere