我要計算在每一列中的元素的平均值大於零的平均值,該值大於零的矩陣,該矩陣定義爲:如何計算元件在矩陣
G =
1 2 3 0 9 4
0 1 3 4 0 0
如果元件是zerro,我們會忽略它,不考慮平均值。我的預期結果是
MeanG= 1/1 3/2 6/2 4/1 9/1 4/1
如何通過matlab代碼實現?
我要計算在每一列中的元素的平均值大於零的平均值,該值大於零的矩陣,該矩陣定義爲:如何計算元件在矩陣
G =
1 2 3 0 9 4
0 1 3 4 0 0
如果元件是zerro,我們會忽略它,不考慮平均值。我的預期結果是
MeanG= 1/1 3/2 6/2 4/1 9/1 4/1
如何通過matlab代碼實現?
對於一個相當簡單的解決方案,如果您有統計工具箱,只需用NaN
替換所有的零和負值,然後使用nanmean
。
因此:
>> Gnan = G;
>> Gnan(Gnan <= 0) = NaN;
>> out = nanmean(Gnan)
out =
1.0000 1.5000 3.0000 4.0000 9.0000 4.0000
我做了G
一個副本,因爲我假設你想保留的G
原始版本比計算的平均這種方式以外的任何進一步的分析。
如果您沒有訪問nanmean
,你可以做的是看看每一列,並確定有多少個零和底片有。一旦完成此操作,只需總結每個列中的所有值,即而不是爲零且爲負值,然後除以值爲而非爲零且在每列中爲負的值的總數。喜歡的東西:
>> zero_neg = G <= 0;
>> Gcopy = G;
>> Gcopy(zero_neg) = 0;
>> out = sum(Gcopy) ./ (size(G,1) - sum(zero_neg))
out =
1.0000 1.5000 3.0000 4.0000 9.0000 4.0000
這裏的複雜性是我們尋找那些爲零或負數,則使G
副本,並設置在這個副本這些元素爲零,以便不被添加這些條目元素納入總和。您必須通過除以而不是爲零或負數(或者實際上僅爲正值... see Nras's post)的條目總數來計算正確的平均值。
請注意,我還保留G
的副本,並對此副本進行變異以計算我們的平均值,因爲我假設您想要保留原始版本G
以供進一步分析。
Jubobs取得了很好的點。如果這個矩陣包含浮點數,由於精度和準確性,與像0這樣的確定數相比是非常危險的。例如,如果這是一個矩陣,其中有期望爲零的元素,但它們不是由於浮點不精確性,那麼這將無法準確計算出您期望的均值。看看這篇文章,通過@gnovice瞭解更多詳情這個偉大的答案:Why is 24.0000 not equal to 24.0000 in MATLAB?
沒有工具箱依賴默認的解決方案可能會閱讀:
G(G<0) = 0; % // not needed if G contains only positive numbers as in your example
sum(G, 1)./sum(G~=0, 1)
ans =
1.0000 1.5000 3.0000 4.0000 9.0000 4.0000
我們用數字總結了手動,但只有鴻溝的非零元素。爲了也總結1列數組的正確維數,還應該指定維數。
請注意,這種做法可能失敗的列,其中只包含零(或負值)
有很多方法可以做到這一點,你可以找到零的數量在你的矩陣,你當刪除在計算平均
z = size(A(find(A<0)))
如果你的其他數字都是積極的,你可以直接這樣做
mean = sum(G)./size(G(find(G>0)),1)
我嘗試了第二個建議。它不會提供所需的輸出。 – kkuilla 2014-12-05 16:12:55
您的Matrix中是否有負值?如果你這樣做,你的意思是錯誤的,因爲G> 0不會計算這些單元格,或者你可以嘗試G〜= 0而不是G> 0;哦,對不起,沒有正確閱讀,你問每個專欄的意思!最快的方法是sum(G,1)./ sum(G〜= 0,1),1表示按列操作和,如果你想要行,它的2. – GameOfThrows 2014-12-05 16:16:31
我試着用OP建議的輸入和我期待預期的結果。 – kkuilla 2014-12-05 16:17:53
重要的問題:這是否矩陣只包含整數,還是它包含浮點數? – Jubobs 2014-12-05 16:02:48