2014-12-05 106 views
2

我要計算在每一列中的元素的平均值大於零的平均值,該值大於零的矩陣,該矩陣定義爲:如何計算元件在矩陣

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代碼實現?

+1

重要的問題:這是否矩陣只包含整數,還是它包含浮點數? – Jubobs 2014-12-05 16:02:48

回答

5

對於一個相當簡單的解決方案,如果您有統計工具箱,只需用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?

+0

感謝rayryeng。我的矩陣包含浮點。但是,別擔心。我可以使用閾值來過濾它。因此小於閾值的元素將爲零。 – user8264 2014-12-05 17:50:32

+0

@ user8264 - 好的,那麼看起來你就是這樣設置的!祝你好運! – rayryeng 2014-12-05 17:51:59

+0

不錯的做法,並注意這裏也非常相關 – 2014-12-05 18:27:21

3

沒有工具箱依賴默認的解決方案可能會閱讀:

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列數組的正確維數,還應該指定維數。

請注意,這種做法可能失敗的列,其中只包含零(或負值)

1

有很多方法可以做到這一點,你可以找到零的數量在你的矩陣,你當刪除在計算平均

z = size(A(find(A<0))) 

如果你的其他數字都是積極的,你可以直接這樣做

mean = sum(G)./size(G(find(G>0)),1) 
+0

我嘗試了第二個建議。它不會提供所需的輸出。 – kkuilla 2014-12-05 16:12:55

+0

您的Matrix中是否有負值?如果你這樣做,你的意思是錯誤的,因爲G> 0不會計算這些單元格,或者你可以嘗試G〜= 0而不是G> 0;哦,對不起,沒有正確閱讀,你問每個專欄的意思!最快的方法是sum(G,1)./ sum(G〜= 0,1),1表示按列操作和,如果你想要行,它的2. – GameOfThrows 2014-12-05 16:16:31

+0

我試着用OP建議的輸入和我期待預期的結果。 – kkuilla 2014-12-05 16:17:53