2016-10-28 4 views
1

я следующая инструкция в 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++ для накопителя.

ответ

1

Использование

sparse(A, 1, B, sz(1), sz(2)) 

Пример:

A = [5;4;6;5;2;5;2;5;5;2]; 
B = [6 3 1 4 9 8 1 5 8 9]; 
sz = [10 1]; 
out = accumarray (A,B,sz); 
out2 = sparse(A, 1, B, sz(1), sz(2)); 

Это дает

>> out 
out = 
    0 
    19 
    0 
    3 
    31 
    1 
    0 
    0 
    0 
    0 
>> full(out2) 
ans = 
    0 
    19 
    0 
    3 
    31 
    1 
    0 
    0 
    0 
    0 
+0

Спасибо! Работает отлично. Теперь я просто нашел способ сделать это в C++. Armadillo не поддерживает разреженную инициализацию с использованием идентичных индексов. Так может быть, мне придется искать другую библиотеку. –

+0

Я был неправ. Армадилло поддерживает разреженную инициализацию матрицы, используя идентичные местоположения 'sp_mat (add_values, местоположения, значения, n_rows, n_cols, sort_locations = true, check_for_zeros = true)'. Спасибо за ваш ответ. –