2014-09-21 49 views
2

說,例如,我有以下矩陣:我該如何平均分塊列?

[1 2 3 4 1 2 3 4 

1 2 3 4 1 2 3 4 

1 2 3 4 1 2 3 4] 

我怎麼能編程平均起來,也就是說,每四列,這樣我就結束了 有:

[2.5 2.5 

2.5 2.5 

2.5 2.5] 

感謝,

湯姆

回答

3

可以沒有循環使用reshape完成:

A = [1 2 3 4 1 2 3 4 
    1 2 3 4 1 2 3 4 
    1 2 3 4 1 2 3 4]; %// data matrix 
N = 4; %// number of columns to average 
result = squeeze(mean(reshape(A,size(A,1), N, []), 2)); 

如果您有圖像處理工具箱,你也可以使用blockproc:基於sum

result = blockproc(A, [size(A,1) N], @(x) mean(x.data, 2)) 
+1

規模有趣的重塑到3d和重新擠壓的方法;) – Thomas 2014-09-21 21:56:43

+0

@Thomas謝謝!我正在考慮刪除我的答案,因爲你的答案是第一個,但是你刪除了它。爲什麼你? – 2014-09-21 22:05:59

+0

我注意到我在結果中交換了列/行,並且您的回答是正確的。 – Thomas 2014-09-21 22:07:07

2

一個簡單的方法是濫用filter

A = [1 2 3 4 1 2 3 4 ; 
    1 2 3 4 1 2 3 4 ; 
    1 2 3 4 1 2 3 4 ] 

N = 4; 

B = filter(ones(1,N)/N,1,A,[],2) 
C = B(:,N:N:end) 

給出:

C = 

    2.5000 2.5000 
    2.5000 2.5000 
    2.5000 2.5000 

這似乎不是所有的整形頗有幾分更快擠壓行動;)雖然沒有證據。

+0

這似乎沒有工作。 – Thomas 2014-09-21 21:59:27

+0

@Thomas,你是對的。只是一個錯字,現在應該工作。 – thewaywewalk 2014-09-21 22:03:02

+0

現在工作。我認爲現在對整個問題進行了很好的探索;) – Thomas 2014-09-21 22:04:44

3

一種方法和reshape -

reshape(sum(reshape(A,size(A,1),N,[]),2)/N,size(A,1),[]) 

這裏給出了迄今發佈的解決方案的一些基準。

基準測試代碼 -

m = 1000; %// No. of rows in input 
n = 4000; %// No. of cols in input 
A = rand(m,n); %// Input with random data 
N = 4; %// number of columns to average; 
num_runs = 200; %// No. of iterations 

disp('----------------- With sum+reshape'); 
tic 
for k1 = 1:num_runs 
    out1 = reshape(sum(reshape(A,size(A,1),N,[]),2)/N,size(A,1),[]); 
end 
toc,clear out1 

disp('----------------- With mean+reshape'); 
tic 
for k1 = 1:num_runs 
    out2 = squeeze(mean(reshape(A,size(A,1), N, []), 2)); 
end 
toc,clear out2 

disp('----------------- With blockproc'); 
tic 
for k1 = 1:num_runs 
    out3 = blockproc(A, [size(A,1) N], @(x) mean(x.data, 2)); 
end 
toc,clear out3 

disp('----------------- With filter'); 
tic 
for k1 = 1:num_runs 
    B = filter(ones(1,N)/N,1,A,[],2); 
    out4 = B(:,N:N:end); 
end 
toc,clear out4 B 

結果 -

----------------- With sum+reshape 
Elapsed time is 4.011844 seconds. 
----------------- With mean+reshape 
Elapsed time is 3.945733 seconds. 
----------------- With blockproc 
Elapsed time is 59.018457 seconds. 
----------------- With filter 
Elapsed time is 31.220875 seconds. 
+0

+1使用'sum'而不是slow'mean'的好主意。和好的基準測試! – 2014-09-21 22:22:01

+0

@LuisMendo好像使用基本的真正給我們的表現!+1已經爲你了!忘了提「擠」擠壓表現! – Divakar 2014-09-21 22:23:20

+0

@Divakar好主意,但對我來說(Matlab2011b,Win7),平均值+重塑更可靠地擊敗其他人。另一個快速解決方案是顯示器([2.5 2.5; 2.5 2.5; 2.5 2.5])':D – Thomas 2014-09-21 22:43:38