說,例如,我有以下矩陣:我該如何平均分塊列?
[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]
?
感謝,
湯姆
說,例如,我有以下矩陣:我該如何平均分塊列?
[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]
?
感謝,
湯姆
一個簡單的方法是濫用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
這似乎不是所有的整形頗有幾分更快擠壓行動;)雖然沒有證據。
這似乎沒有工作。 – Thomas 2014-09-21 21:59:27
@Thomas,你是對的。只是一個錯字,現在應該工作。 – thewaywewalk 2014-09-21 22:03:02
現在工作。我認爲現在對整個問題進行了很好的探索;) – Thomas 2014-09-21 22:04:44
一種方法和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.
規模有趣的重塑到3d和重新擠壓的方法;) – Thomas 2014-09-21 21:56:43
@Thomas謝謝!我正在考慮刪除我的答案,因爲你的答案是第一個,但是你刪除了它。爲什麼你? – 2014-09-21 22:05:59
我注意到我在結果中交換了列/行,並且您的回答是正確的。 – Thomas 2014-09-21 22:07:07