R语言中如何基于0-1矩阵自身行运算生成符合要求的新矩阵
R语言实现二进制矩阵指定运算方案
实现方法
方法1:循环实现(逻辑清晰,适合小规模矩阵)
直接按需求描述的逻辑遍历每一行计算,可读性高,不容易出错:
# 定义示例矩阵 matrix_A <- matrix(c(0,0,1,1,1,0,1,0,1,0,1,1), nrow=3,ncol=4) # 初始化和原矩阵行列一致的结果矩阵 result <- matrix(0, nrow = nrow(matrix_A), ncol = ncol(matrix_A)) # 遍历每一行计算 for (i in seq_len(nrow(matrix_A))) { # 取出除当前行外的所有行,drop=FALSE保证即使只剩1行也保持矩阵结构 other_rows <- matrix_A[-i, , drop = FALSE] # 其余行逐行与当前行做元素级乘法后,按列求和赋值给结果矩阵对应行 result[i, ] <- colSums(other_rows * matrix_A[i, ]) }
运行后输出result即可得到目标矩阵。
方法2:向量化实现(性能优异,适合大规模矩阵)
利用矩阵运算特性规避显式循环,处理行数较多的矩阵时效率远高于循环方案:
matrix_A <- matrix(c(0,0,1,1,1,0,1,0,1,0,1,1), nrow=3,ncol=4) n <- nrow(matrix_A) # 构造对角线为0、其余元素为1的掩码矩阵 mask <- matrix(1, nrow = n, ncol = n) - diag(n) # 先通过矩阵乘法得到每列除当前行外的元素和,再和原矩阵逐元素相乘得到结果 result <- (mask %*% matrix_A) * matrix_A
该方案的逻辑为:掩码矩阵与原矩阵相乘后,得到的矩阵第i行j列的值为原矩阵第j列中除第i行外所有元素的和;再与原矩阵逐元素相乘时,原矩阵对应位置为0则结果直接归零,为1则保留其他行的求和结果,完全匹配需求规则。
验证结果
示例矩阵运行两种方法后得到的result均为:
[,1] [,2] [,3] [,4] [1,] 0 1 1 0 [2,] 0 1 0 1 [3,] 0 0 1 1
与题目给出的目标结果完全一致。
内容的提问来源于stack exchange,提问作者MD_Yang
相关产品推荐
相关产品推荐

