2014-10-06 415 views
1

我有一個尺寸爲(122,169,137,16)的四維陣列,其中122是天,169是經緯度,而16是一年。 我必須找到每年122天的平均值。我試過這樣的:如何在matlab中找到四維數組第一維上的均值?

for i=1:122 
    for j=1:16 
     c=t1(i,:,:,j) 
     d=mean(c(:)); 
    end 
end 

但它說索引超過矩陣的尺寸。

我是matlab新手。你能否建議我輕鬆地做到這一點。

+0

檢查平均值的文檔。如果我沒有弄錯,你可以將維度定義爲第二項:'mean(c,1)'Btw。你期望結果如何?畢竟你有4個維度意思是做平均的你得到一個3d結果。你想要那個嗎?如果是這樣,'意味着(c)'應該做的伎倆,因爲它從第一維開始。無論如何,你可能需要進一步解釋你的問題 – 2014-10-06 07:25:55

+0

你是不是故意爲每年的122天中的每一天找到意思?看來這樣,因爲你有 - '「t1(i,:,:,j)」'。 – Divakar 2014-10-06 07:32:39

+0

感謝您的回覆。我應該生成16個矩陣,這將是我猜想的1列矩陣,以便我可以繪製這些矩陣的pdf。 – MelB 2014-10-06 12:57:39

回答

0

您可以使用一個事實,即一個二維矩陣,Xmean(X(:))相同mean(mean(X,1), 2)和使用

d = squeeze(mean(mean(C,2),3)); 

它首先在二維上取平均值,然後在第三個上得到大小爲122 x 1 x 1 x 16的矩陣。然後squeeze將它轉換成尺寸爲122 x 16的矩陣。

+0

謝謝,它的工作 – MelB 2014-11-08 09:33:03

0

看來t1是輸入4D陣列。您需要使用permute來重新排列輸入數組的維度,以使第四維成爲新的第二維。然後,將其重新組合爲三維數組,以便第三維中的每個切片都包含要計算其平均值的所有元素。因此,該代碼會是這個樣子 -

mean(reshape(permute(t1,[1 4 2 3]),size(t1,1),size(t1,4),[]),3) 

如果你想避免permute性能,第二個辦法是 -

[n1,n2,n3,n4] = size(t1); 
output = reshape(mean(reshape(t1,[],n2*n3,n4),2),n1,n4) 

在這第二種方法,我們不」重新安排尺寸。相反,我們將第二維和第三維合併到第二維中,沿第二維計算平均值,並最終重塑它以匹配所需結果的大小。

您也可避免外重塑通過squeeze -

squeeze(mean(reshape(t1,[],n2*n3,n4),2)) 
0

我不知道,如果你正在尋找的平均天或其他值的平均值。假設你正在尋找天的平均值。一個簡單的方法,讓你明白髮生了什麼,是這樣的:

for i=1:16     % for each year (instead of 16 you can use size(t1,4)) 
    c = t1(:,1,1,i);   % extract the days, making c a matrix sized [122,1,1,1] 
    cr = reshape(c,[122,1]); % remove the excess dimensions to make [122,1] (might be unnecessary) 
    d(i) = mean(cr);   % compute the mean and store results into d 
end 

結果d是16個元素的向量,包含天的平均每年。

關於您的代碼:

  • 變量d是一個標量,但所用的2嵌套for循環的內部。這意味着無論它計算什麼,它只會返回兩個循環的最後一次的平均值。正確使用它將是d(i,j),因此它存儲了每個循環的所有平均值。
  • 您正在計算c(:)的平均值,其中c的維數爲[1,169,236,1]。這意味着你排序矩陣劃分成矢量你計算兩個緯度+長在一起的平均
+0

感謝您的回覆。我嘗試了你的建議,但它在使用重塑命令時出錯。 – MelB 2014-10-06 12:56:08

+0

@Vidhi你確定你把它複製了嗎?我用這些維度做了隨機值的矩陣t1,代碼運行良好。你甚至不需要重塑線,因爲矩陣c已經減少到[122,1]。但它可能是老版本的Matlab不支持的東西,我正在使用R2013a。 – acerne 2014-10-06 14:05:26

相關問題