Как вернуть разреженную матрицу из CUSP::csr_matrix в MEX в Matlab?

Я разрабатываю свой MEX-файл для разреженных матричных вычислений с помощью CUDA. Я использую библиотеку CUSP. Я не знаю, как вернуть cusp::csr_matrix обратно в Matlab. Например, у меня есть

cusp::csr_matrix<mwIndex,double,cusp::host_memory> At(m,n,N);

Итак, это матрица At в формате CSR, которую, скажем, я вычислил. Теперь я должен вернуть его Матлабу. Что-то вроде этого:

plhs[0] = At;

Но, конечно, это не работает, во-первых, потому что At на GPU. Я думаю, что я должен использовать At.values ​​и методы для индексов. Но также, как назначить их хост-данным?

Кто-нибудь может подсказать, как все это сделать?:)

1 ответ

Решение

Matlab также хранит разреженные матрицы в формате CSR, так что это не сложно. Все, что вам нужно сделать, это выделить разреженную матрицу, используя mxArray *mxCreateSparse(mwSize m, mwSize n, mwSize nzmax, mxComplexity ComplexFlag); а затем установить массивы pr, ir, jc (используя mxGetPr, mxGetIr, mxGetJc). Pr соответствует массиву значений в cusp, ir - column_indices и jc - row_offsets. Если матрица находится в памяти устройства, скопируйте ее, используя cudaMemcpy с cudaMemcpyDeviceToHost, Вот несколько примеров использования разреженных матриц (это для Octave, но должно работать и для Matlab).

Другие вопросы по тегам