我有一個 720 x 1280 的 matlab 陣列。我需要對其中的每個 5x5、10x10、20x20 和 40x40 子陣列求和,然后取平均值。這需要創建 4 個大小為 (720/5, 1280/5), (720/10, 1280/10),(720/20, 1280/20),(720/40, 1280/40) 的新陣列,我如何使用 for 回圈來做到這一點?
uj5u.com熱心網友回復:
正如@bla 提到的,傳統上這不會for在 MATLAB 中使用回圈來完成。無論如何,這里有一個例子:
設定
data = rand(720, 1280);
windowSize = 5
out = nan(size(data)/windowSize);
在這里,我們遍歷每個塊,其中塊的限制由((ii-1)*windowSize 1)and定義(ii*windowSize)(例如1:5, 6:10, 11:15)。
for ii = 1:size(data, 1)/windowSize
for jj = 1:size(data, 2)/windowSize
currentData = data( ((ii-1)*windowSize 1):(ii*windowSize) ,...
((jj-1)*windowSize 1):(jj*windowSize) );
out(ii,jj) = mean(currentData(:));
end
end
更改視窗大小也可以使用for回圈自動進行,但我將把它作為一個家庭作業問題。
uj5u.com熱心網友回復:
對于這類問題,我覺得將矩陣轉換為塊的單元陣列,然后在塊上使用cellfun可以得到一個很好且可讀的代碼:
data = rand(720, 1280);
[sz1,sz2] = size(data);
wSize = 5;
idx1 = wSize*ones(1,sz1/wSize);
idx2 = wSize*ones(1,sz2/wSize);
% Convert input matrix to a cell array of wSize x wSize blocks
C = mat2cell(data,idx1,idx2);
% Apply the "Take the mean of all elements" function to each blocks
out = cellfun(@(X) mean(X(:)),C);
請注意cellfun,默認情況下,直接將輸出連接到一個陣列中。
uj5u.com熱心網友回復:
如果你有影像處理工具箱,你可以很容易地做到這一點im2col,然后mean和reshape:
x = rand(4,6); % data (example)
sz = [2 2]; % block size
result = reshape(mean(im2col(x, sz, 'distinct'), 1), size(x)./sz);
uj5u.com熱心網友回復:
您可以使用cumsum和diff來計算塊平均值:
a = rand(720, 1280);
s(2:720 1, 2:1280 1) = cumsum(cumsum(a, 1), 2);
m5 = diff(diff(s(1:5:end, 1:5:end), [], 1), [], 2)/(5*5);
m10 = diff(diff(s(1:10:end, 1:10:end), [], 1), [], 2)/(10*10);
m20 = diff(diff(s(1:20:end, 1:20:end), [], 1), [], 2)/(20*20);
m40 = diff(diff(s(1:40:end, 1:40:end), [], 1), [], 2)/(40*40);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/489883.html
標籤:matlab
上一篇:跨單獨mat檔案的平均雙精度陣列
