я следующая инструкция в MATLABAccumarray Matlab, используя разреженную матрицу умножения
out = accumarray (A,B,sz);
, где В и А имеет размер 1x957600 и 957600x1 соответственно и SZ является [1445 1]. Результат - 1445x1.
Мой вопрос в том, как мы можем реализовать эту инструкцию без использования накопителя и использования разреженного умножения матрицы.
Я нашел следующее решение, но я не знаю, как реализовать его в соответствии с данными у меня есть
Matlab код
%fake data setup
M=1e5;
A=kron(speye(M),ones(1,16));
N=size(A,2);
[I,J]=find(A);
x=rand(N,1);
%pretend we build A from scratch
tic;
A=sparse(I,J,1);
toc %Elapsed time is 0.062737 seconds.
%Apply A
tic
y1=A*x;
toc %Elapsed time is 0.006868 seconds.
%Using accumarray
b=x(J);
tic
y2=accumarray(I,b,[M,1]);
toc %Elapsed time is 0.012236 seconds.
Я задаю этот вопрос, потому что я хочу использовать accumarray в C++. У меня есть решение для этого, но для его вычисления требуется много времени. Here - мой вопрос от двух дней назад, который имеет реализацию C++ для накопителя.
Спасибо! Работает отлично. Теперь я просто нашел способ сделать это в C++. Armadillo не поддерживает разреженную инициализацию с использованием идентичных индексов. Так может быть, мне придется искать другую библиотеку. –
Я был неправ. Армадилло поддерживает разреженную инициализацию матрицы, используя идентичные местоположения 'sp_mat (add_values, местоположения, значения, n_rows, n_cols, sort_locations = true, check_for_zeros = true)'. Спасибо за ваш ответ. –