gpt4 book ai didi

r - 如何有效地检查矩阵是否为二进制形式(例如所有 1's or 0' s)?

转载 作者:行者123 更新时间:2023-12-04 05:18:05 26 4
gpt4 key购买 nike

我有一个函数,它将一个 m x n 大小的(可能)二进制矩阵作为输入,如果矩阵包含的数字不是 0 或 1,或者是 NA,我想返回一个错误处理。我怎样才能有效地检查这个?

例如,通过为 10 x 10 生成一些数据:

> n=10;m=10
> mat = round(matrix(runif(m*n), m, n))
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 1 0 1 1 0 1 0 1 0
[2,] 0 0 0 0 0 0 0 0 0 1
[3,] 1 1 0 1 1 0 0 1 1 0
[4,] 1 1 1 1 0 1 0 0 1 1
[5,] 1 1 1 0 0 1 1 1 0 1
[6,] 1 0 1 0 0 0 0 1 0 0
[7,] 0 0 0 1 0 1 1 1 1 0
[8,] 0 0 0 1 0 1 1 1 1 1
[9,] 0 0 1 1 0 1 1 1 1 1
[10,] 1 0 1 1 0 0 0 0 1 1

应始终返回矩阵是二进制的,但可以通过以下方式之一更改它:
> mat[1,1]=NA
> mat[1,1]=2

应该返回矩阵不是二进制的。

目前,我一直在我的功能中使用:
for(i in 1:nrow(mat))
{
for(j in 1:ncol(mat))
{
if(is.na(mat[i,j])|(!(mat[i,j] == 1 | mat[i,j] == 0)))
{
stop("Data must be only 0s, 1s")
}
}
}

但是单独检查大矩阵的每个值似乎非常缓慢和低效。有没有一种聪明,简单的方法来做到这一点我想念?

谢谢

最佳答案

以下是一些选项的时间安排(包括其他答案中建议的选项):

n=5000;m=5000
mat = round(matrix(runif(m*n), m, n))
> system.time(stopifnot(sum(mat==0) + sum(mat==1) == length(mat)))
user system elapsed
0.30 0.02 0.31
> system.time(stopifnot(all(mat %in% c(0,1))))
user system elapsed
0.58 0.06 0.63
> system.time(stopifnot(all(mat==0 | mat==1)))
user system elapsed
0.77 0.03 0.80

考虑到它是一个 5000 x 5000 的矩阵,它们都非常快!三者中最快的似乎是:
stopifnot(sum(mat==0) + sum(mat==1) == length(mat))

关于r - 如何有效地检查矩阵是否为二进制形式(例如所有 1's or 0' s)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23274170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com