2012-11-28 104 views
1

好的,我有一個數組< 134x106x108>。我想要做的是循環這個數組,並將平均值/標準偏差存儲到另一個數組中。所以基本上會有這樣的意思,就是這個意思是數組和數組。通過3D數組循環查找均值和標準差

%dayv=<134x106x108> 
sdArray=zeros(1,106,108); 
meanArray=zeros(1,106,108); 
for i=1:size(dayv,1) 
    %store means/standard deviation into an array 
    meanArray(i,:,:) = squeeze(mean(dayv(i,:,:))); 
    sdArray(i,:,:) = squeeze(std(dayv(i,:,:))); 
end 
+0

所以,你希望每個意思是整個106x108值的平均值? – jerad

+0

@jerad是的,這就是我想要的。所以這是一系列的手段,但我會有134個。 – Supa

回答

3

您不應該需要使用循環來解決此問題。 MATLAB的內置函數meanstd能夠沿一個矩陣的各個尺寸計算的:

meanArray = squeeze(mean(dayv, 1)); 
sdArray = squeeze(std(dayv, [], 1)); 

上面的代碼將沿着第一維度平均值,併產生meanArraysdArray其是106x108,作爲初始化在你的代碼中。如果,另一方面,你要meanArraysdArray是長度134(如所隱含的循環)的單維向量,你會做

meanArray = mean(mean(dayv, 3), 2); 
sdArray = squeeze(std(reshape(dayv, 134, []), [], 2)); 

其中reshape整理你的矩陣,使其134x( 106 * 108),以便std可以正確處理。

您可以用for循環基於代碼比較上述辦法:

for i=1:size(dayv,1) 
    slice = squeeze(dayv(i,:,:)); 
    meanArray(i) = mean(slice(:)); 
    sdArray(i) = std(slice(:)); 
end 
+0

那麼我如何得到134個平均值呢?如果我只是'av = squeeze(mean(dayv,1));'返回一個<106x108>。 – Supa

+0

擴展解答 – Isaac

3

如果您希望您的每一個手段,是整個106x108矩陣的平均那麼一個簡單的辦法是重塑你的3D基質成使用2D矩陣,

dayv2 = reshape(dayv,[134 106*108]); 

那些106x108矩陣現在每個是在新的矩陣的行向量。

然後

meanArray = mean(dayv2,2); % Get mean of each row 
stdArray = std(dayv2,0,2);% Std of each row 
+0

@Isaac,是的謝謝你! – jerad