我有一個尺寸爲(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新手。你能否建議我輕鬆地做到這一點。
我有一個尺寸爲(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新手。你能否建議我輕鬆地做到這一點。
您可以使用一個事實,即一個二維矩陣,X
,mean(X(:))
相同mean(mean(X,1), 2)
和使用
d = squeeze(mean(mean(C,2),3));
它首先在二維上取平均值,然後在第三個上得到大小爲122 x 1 x 1 x 16
的矩陣。然後squeeze
將它轉換成尺寸爲122 x 16
的矩陣。
謝謝,它的工作 – MelB 2014-11-08 09:33:03
看來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))
我不知道,如果你正在尋找的平均天或其他值的平均值。假設你正在尋找天的平均值。一個簡單的方法,讓你明白髮生了什麼,是這樣的:
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個元素的向量,包含天的平均每年。
關於您的代碼:
檢查平均值的文檔。如果我沒有弄錯,你可以將維度定義爲第二項:'mean(c,1)'Btw。你期望結果如何?畢竟你有4個維度意思是做平均的你得到一個3d結果。你想要那個嗎?如果是這樣,'意味着(c)'應該做的伎倆,因爲它從第一維開始。無論如何,你可能需要進一步解釋你的問題 – 2014-10-06 07:25:55
你是不是故意爲每年的122天中的每一天找到意思?看來這樣,因爲你有 - '「t1(i,:,:,j)」'。 – Divakar 2014-10-06 07:32:39
感謝您的回覆。我應該生成16個矩陣,這將是我猜想的1列矩陣,以便我可以繪製這些矩陣的pdf。 – MelB 2014-10-06 12:57:39