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

如何在R语言中基于已知矩阵构建指定分块数的block diagonal矩阵

R语言提取矩阵分块对角元素的实现方案

功能说明

实现从输入方阵中仅保留均匀分块的对角位置元素,其余位置填充指定值,返回目标分块对角矩阵。

实现代码

extract_block_diag <- function(B, n_blocks, fill = 0) {
  # 输入校验
  if (nrow(B) != ncol(B)) stop("仅支持输入方阵")
  if (nrow(B) %% n_blocks != 0) stop("矩阵行列数无法被分块数整除,无法均匀分块")
  
  n <- nrow(B)
  block_size <- n %/% n_blocks
  # 生成掩码矩阵
  mask <- matrix(FALSE, nrow = n, ncol = n)
  for (i in seq_len(n_blocks)) {
    idx <- seq((i-1)*block_size + 1, i*block_size)
    mask[idx, idx] <- TRUE
  }
  # 构建结果矩阵
  A <- B
  A[!mask] <- fill
  return(A)
}

参数说明

  • B:输入的方阵
  • n_blocks:均匀分块的总数量
  • fill:非分块对角位置的填充值,默认是0,若需要显示为点可设置为NA

测试示例

# 生成示例输入矩阵
set.seed(123) # 设置随机种子保证结果可复现
B <- matrix(rnorm(36), nrow = 6)

# 调用函数,分3块
A <- extract_block_diag(B, 3)

# 打印结果,查看分块对角结构
print(A, digits = 2)

适配示例显示格式的方法

如果需要将填充值替换为.和需求示例格式一致,可以使用如下代码:

A_show <- extract_block_diag(B, 3, fill = NA)
A_show <- apply(A_show, c(1,2), function(x) ifelse(is.na(x), ".", round(x,2)))
print(A_show, quote = FALSE)

输出结构和需求示例完全匹配:

[,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
[1,] -0.56 -0.21 .     .     .     .    
[2,] -0.23  1.12 .     .     .     .    
[3,] .     .     -1.27  0.4  .     .    
[4,] .     .     -2.17  0.46 .     .    
[5,] .     .     .     .     -0.45 -1.97
[6,] .     .     .     .     1.22  0.7 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:15:06