2015-10-14 24 views
0

我有一個矩陣A = [0 3 4; 5 0 6; 0 6 0];計算矩陣中的特殊零元素

我知道要計算零元素的總數,我可以簡單地使用函數find。也就是說,Total_number_of_zero_elements = length(find(A==0)); 並且這將給我4.

問題:

採取例如現在矩陣B如下產生:

B = toeplitz(0.1.^(0:30-1)); 
Total_number_of_zero_elements = length(find(B==0)); 

上面的代碼將給出:Total_number_of_zero_elements = 0. 矩陣B包含很多0值,但寫入爲0.0000。

所以matlab不能區分0和0.0000之間使用函數find?

任何幫助將不勝感激!

+1

'總和(ABS(B)<= EPS)'或替換帶定製公差值的「eps」? – Divakar

+1

另外,如果你有一個元素「B(i,j)」是0.0000,那麼檢查'format long e; B(i,j)'看到它實際上不是0而是在1e-15'附近。 –

+0

好的!我現在知道了;謝謝 – Christina

回答

5

浮點數有屬性,他們沒有完全表示。如果將矩陣與其逆矩陣數值相乘,則非對角元素將不爲0,而是圍繞eps(1)

爲了檢查漂浮物的零度,請使用閾值:find(abs(B)<1e-10)。 (注意abs:沒有那-10也將被限定爲0.)

很明顯,應該仔細選擇閾值:足夠大以至於捕獲數字零點,但足夠小以使實際非零點保持非零。

在您的例子

B = toeplitz(0.1.^(0:30-1)); 

最小的號碼是1e-29,這是很容易地表示爲一個雙精度數,這顯然不等於0,如果你做到這一點。此外,你會碰到從eps(0)開始的問題大致爲5e-324。任何大於此數的數字都不會完全爲零。 (但是,如果你執行計算和期望的結果是0,則它可能會的eps(1)量級如我上面寫)

+0

謝謝您的詳細解答! – Christina