矩阵中的不同阈值

时间:2014-09-03 15:15:52

标签: r for-loop matrix

我有两个矩阵。在matrix1中只是值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)

现在我想为matrix2定义一个阈值,这样就可以了 值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循环,但它没有用。

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

感谢您的帮助!

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

真正的问题是你每次都在循环中改变matrix2的值,所以在第一次循环之后,所有的值都是0或100,所以不同的阈值无关紧要。这样的事情怎么样?首先,我们可以定义一个KSS函数,它接受两个矩阵,将它们转换为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