2014-08-30 63 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

尼斯标杆! +1 – 2014-08-30 15:46:43

+0

@LuisMendo是的,谁说'for-loops'不坏了! :) – Divakar 2014-08-30 16:14:57

+0

我很高兴他们是:-P – 2014-08-30 16:18:25

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 2014-08-30 13:00:18