2014-08-30 4 views

ответ

5

Идеальная установка для bsxfun с @rdivide вариант, чтобы позволить v внутренне расширить до размеров M, а затем выполнить элементное разделение -

d = bsxfun(@rdivide,M,v) 

Бенчмаркинг на решениях

Бенчмаркинг Код

N_arr = [100 200 500 1000 2000 4000]; 
timeall = zeros(4,numel(N_arr)); 
for k1 = 1:numel(N_arr) 

    N = N_arr(k1); 
    M = rand(N,N); 
    v = rand(1,N); 

    f = @() bsxfun(@rdivide,M,v); 
    timeall(1,k1) = timeit(f); 
    clear f 

    f = @() M ./ repmat(v, size(M, 1), 1); 
    timeall(2,k1) = timeit(f); 
    clear f 

    f = @() M ./ (ones(size(M,1),1)*v); 
    timeall(3,k1) = timeit(f); 
    clear f 

    f = @() ele_div(M,v); 
    timeall(4,k1) = timeit(f); 
    clear f 
end 
figure,hold on,grid on 
plot(N_arr,timeall(1,:),'-ro'),plot(N_arr,timeall(2,:),'-kx') 
plot(N_arr,timeall(3,:),'-g+'),plot(N_arr,timeall(4,:),'-b.') 
legend('BSXFUN','REPMAT','ONES','FOR-LOOP'), 
xlabel('Datasize ->'),ylabel('Time(sec) ->') 

Попутный функция

function MM = ele_div(M,v) 
MM = zeros(size(M)); 
for i=1:size(M,1) 
    MM(i,:) = M(i,:) ./ v; 
end 
return; 

Сравнительный анализ результатов

enter image description here

+0

Nice бенчмаркинга! +1 –

+0

@ LuisMendo Да, кто сказал, что «for-loops» неплохое! :) – Divakar

+0

Я рад, что они :-P –

0

Вы можете использовать repmat сделать v такой же размер, как M:

d = M ./ repmat(v, size(M, 1), 1) 
2

Пара способов:

%# FOR-loop 
MM = zeros(size(M)); 
for i=1:size(M,1) 
    MM(i,:) = M(i,:) ./ v; 
end 

%# BSXFUN 
MM = bsxfun(@rdivide, M, v); 

%# REPMAT 
MM = M ./ repmat(v,size(M,1),1); 

%# repetition by multiplication 
MM = M ./ (ones(size(M,1),1)*v); 
+0

+1 для альтернативных способов! – Divakar

Смежные вопросы