You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

代码说明

  1. 用lapply(1:nrow(X), ...)遍历原矩阵的每一行索引i
  2. 对每个行索引i,用sapply(1:ncol(X), ...)遍历列索引j,计算每个位置(i,j)的转换值
  3. 通过do.call(rbind, ...)将所有转换后的行组合成新矩阵
  4. 最后为新矩阵设置行列名,保证结构与原矩阵一致

内容的提问来源于stack exchange,提问作者nickolakis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:30:52