2014-09-03 97 views
0

我有兩個矩陣。在矩陣1中只是值0和255.另一個矩陣具有不同的值。矩陣中的不同閾值

vec1 <- c(255,0,0,0,255,0,0,255,255,0) 
vec2 <- c(0,255,0,255,0,0,255,255,0,0) 
vec3 <- c(112,68,235,147,89,56,245,7,119,76) 
vec4 <- c(194,158,13,41,182,218,5,78,195,235) 

matrix1 <- matrix(c(vec1,vec2,vec1,vec2),10) 
matrix2 <- matrix(c(vec3,vec4,vec3,vec4),10) 

現在我想定義矩陣2的閾值,因此,也有剛剛 值0和255

matrix2[matrix2 > 150] <- 255 
matrix2[matrix2 <= 150] <- 0 

然後,我想從兩個矩陣的技巧評分。 這些是針對一個閾值,但我希望所有閾值(從0到255)的技能分數爲 。

a <- length(which(matrix1 == 255 & matrix2 == 255)) 
b <- length(which(matrix1 == 0 & matrix2 == 255)) 
c <- length(which(matrix1 == 255 & matrix2 == 0)) 
d <- length(which(matrix1 == 0 & matrix2 == 0)) 

KSS <- ((a*d)-(b*c))/((a+c)*(b+d)) 

我試過用循環,但它沒有奏效。

for (i in c(1:255)) { 
    matrix2[matrix2 >i] <-255 
    matrix2[matrix2 <= i] <-0 
} 

感謝您的幫助!

回答

0

真正的問題是,你在循環中每次更改matrix2的值,所以在第一個循環之後所有的值都是0或100,所以不同的閾值並不重要。怎麼樣這樣的事情。首先,我們可以定義一個採用這兩個矩陣的函數,將它們轉換爲2x2表並計算KSS值。

KSS <- function(a,b) { 
    x <- table(factor(a, levels=c(0,100)), factor(b, levels=c(0,100))) 
    ((x[2,2]*x[1,1])-(x[1,2]*x[2,1]))/((x[2,2]+x[2,1])*(x[1,2]+x[1,1])) 
} 

然後,你可以做

kss.val <- sapply(1:100, function(thresh) { 
    KSS(matrix1, (matrix2 > thresh) * 100) 
}) 

以獲得每個閾值KSS。然後,你可以繪製出結果,如果你喜歡

plot(1:100, kss.val) 

enter image description here

+0

謝謝!但我犯了一個錯誤..矩陣的值從0到255 – Franzi 2014-09-04 07:28:42

1

爲了您的閾值矩陣,使用下面的結構:

(matrix2>50)*100 
     [,1] [,2] [,3] [,4] 
[1,] 0 100 0 100 
[2,] 100 100 100 100 
[3,] 0 0 0 0 
[4,] 0 0 0 0 
[5,] 100 100 100 100 
[6,] 100 0 100 0 
[7,] 0 0 0 0 
[8,] 0 100 0 100 
[9,] 0 100 0 100 
[10,] 100 0 100 0 

對於A,B,C和D可以簡化到(而不是要求其他閾值矩陣的話):

a <- sum(!!matrix1 & !!(matrix2>50)) 
b <- sum(!matrix1 & !!(matrix2>50)) 
c <- sum(!!matrix1 & !(matrix2>50)) 
d <- sum(!matrix1 & !(matrix2>50)) 
+0

感謝您的幫助,但我怎麼能做到這一點時,我值從0到255? – Franzi 2014-09-04 11:08:34