如何使用Matlab中的矢量沿矩陣劃分矩陣或進行其他算術運算?如何在Matlab中沿軸分割矩陣?
例子:
M = [2 4 6 ; ...
8 4 2 ];
v = [2 4 2];
d = M/v; % divide along first axis
d =
1 1 3
4 1 1
如何使用Matlab中的矢量沿矩陣劃分矩陣或進行其他算術運算?如何在Matlab中沿軸分割矩陣?
例子:
M = [2 4 6 ; ...
8 4 2 ];
v = [2 4 2];
d = M/v; % divide along first axis
d =
1 1 3
4 1 1
完美設置爲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;
標結果
你可以使用repmat
使v
尺寸相同M
:
d = M ./ repmat(v, size(M, 1), 1)
幾種方法:
%# 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);
+1替代方法! – Divakar 2014-08-30 13:00:18
尼斯標杆! +1 – 2014-08-30 15:46:43
@LuisMendo是的,誰說'for-loops'不壞了! :) – Divakar 2014-08-30 16:14:57
我很高興他們是:-P – 2014-08-30 16:18:25