r - 试图在多个二进制矩阵列表中找到每个 3x3 瓦片中 1 的对角线数
问题描述
我试图在每个 3x3 瓷砖中找到对角线 1 的计数,例如
0 0 1 1 0 0 1 1 1 0 1 1
0 1 0 0 1 0 1 1 1 0 1 0
1 0 0 or 0 0 1 or 1 1 1 or 1 0 0
仅举例来说,3x3 平铺中的其他值仅对角线无关紧要。对角线是指主对角线以及反向主对角线。例如,以下矩阵将输出 3 个对角线,
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
我正在阅读矩阵列表...
set.seed(1234)
mat1 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
set.seed(99)
mat2 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
set.seed(123)
mat3 <- matrix(sample(c(0,1), 225, prob=c(0.8,0.2), replace=TRUE), nrow = 15)
mat_list <- list(mat1, mat2, mat3)
关于如何做到这一点的任何建议?
解决方案
假设m
如最后的注释所示(特别是条目是双精度而不是整数),位置是固定距离的,所以我们可以使用rollapply
函数identical
.
library(zoo)
num_diags <- function(m) {
nr <- nrow(m)
sum(rollapply(c(m), list(c(0, nr+1, 2*nr+2)), identical, c(1, 1, 1))) +
sum(rollapply(c(m), list(c(0, nr-1, 2*nr-2)), identical, c(1, 1, 1)))
}
num_diags(m)
## 3
要将其应用于矩阵列表:
sapply(mat_list, num_diags)
笔记
m <- structure(c(1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(8L,
15L), .Dimnames = list(NULL, NULL))
推荐阅读
- sql - 如何在 T-SQL 中使用 BETWEEN 和 LIKE
- amazon-web-services - 如何使用 SAM 通过 API Gateway 配置异步 lambda 调用?
- r - 对唯一值应用矢量化函数并展开
- asp.net-mvc - 我的数据库中客户端和用户之间的 SignalR 连接
- arrays - 如何使用 Ruby 连接数组中的字符串
- node.js - SyntaxError: Unexpected token / in JSON at position 324
- jquery - 删除特定的 html jquery
- python - 用户警告:在保存文件中找不到训练配置:模型*未*编译。手动编译
- tableau-api - Tableau 中的默认参数值
- pyspark - 我们可以从 aws Glue PySpark 作业触发 AWS Lambda 函数吗?