如何在R语言中使用apply函数对矩阵执行指定归一化运算?
R语言用apply系列函数实现自定义矩阵转换
首先生成示例矩阵:
set.seed(123) X <- matrix(sample(15,9,T),3) colnames(X) <- paste0("X",1:3) X
运行后得到矩阵:
X1 X2 X3 [1,] 15 14 2 [2,] 15 3 6 [3,] 3 10 11
转换规则
生成新矩阵X_new,每个元素遵循公式:xij = xij / ( w * sqrt(xii*xjj))
其中:
- 当行索引
i等于列索引j(对角线元素)时,w=1,结果恒为1 - 当
i≠j时,w=2,按公式计算对应值
实现代码
使用lapply遍历行索引,结合sapply处理每列元素,最终组合成新矩阵:
# 遍历每行索引,生成转换后的行数据 X_new <- do.call(rbind, lapply(1:nrow(X), function(i) { sapply(1:ncol(X), function(j) { xij <- X[i, j] xii <- X[i, i] xjj <- X[j, j] w <- ifelse(i == j, 1, 2) xij / (w * sqrt(xii * xjj)) }) })) # 继承原矩阵的行列名 colnames(X_new) <- colnames(X) rownames(X_new) <- rownames(X) # 保留两位小数查看结果 round(X_new, 2)
运行结果
X1 X2 X3 [1,] 1.00 1.04 0.07 [2,] 1.11 1.00 0.52 [3,] 0.11 0.87 1.00
代码说明
- 用
lapply(1:nrow(X), ...)遍历原矩阵的每一行索引i - 对每个行索引
i,用sapply(1:ncol(X), ...)遍历列索引j,计算每个位置(i,j)的转换值 - 通过
do.call(rbind, ...)将所有转换后的行组合成新矩阵 - 最后为新矩阵设置行列名,保证结构与原矩阵一致
内容的提问来源于stack exchange,提问作者nickolakis
相关产品推荐
相关产品推荐

