如何在R中分批调用10x10矩阵函数生成25x25矩阵?
问题
我有一个最多支持10×10运算的matrix_function,现有包含25个数据点的数据框,需通过该函数生成25×25的矩阵输出。希望编写一个包装函数将运算分批处理(计划分7个批次),但用for循环尝试实现时失败了。
以下是示例数据与函数代码:
id <- LETTERS[1:25] set.seed(04) value <- runif(25,30, 40) data <- data.frame(id, value) # 用于复现的模拟函数 matrix_function <- function(x_id, x, y_id, y){ computed_matrix <- matrix(NA, nrow = 10, ncol = 10) for (i in 1:10) { for (j in 1:10) { computed_matrix[i,j] <- x[i] + y[j] } } colnames(computed_matrix) <- y_id rownames(computed_matrix) <- x_id return(computed_matrix) }
函数调用示例输出:
> matrix_function(x_id=data$id[1:10], x=data$value[1:10], y_id=data$id[11:20], y=data$value[11:20]) K L M N O P Q R S T A 73.40475 68.71801 66.85854 75.39869 70.01407 70.40903 75.56856 71.69788 75.48005 73.47503 B 67.63621 62.94946 61.08999 69.63015 64.24553 64.64048 69.80001 65.92934 69.71150 67.70648 C 70.48415 65.79740 63.93793 72.47808 67.09347 67.48842 72.64795 68.77728 72.55944 70.55442 D 70.32050 65.63376 63.77428 72.31444 66.92982 67.32477 72.48431 68.61363 72.39580 70.39077 E 75.68249 70.99575 69.13628 77.67643 72.29181 72.68677 77.84630 73.97562 77.75779 75.75277 F 70.15103 65.46428 63.60481 72.14497 66.76035 67.15530 72.31483 68.44416 72.22632 70.22130 G 74.79081 70.10407 68.24459 76.78475 71.40013 71.79508 76.95462 73.08394 76.86611 74.86108 H 76.60767 71.92093 70.06146 78.60161 73.21699 73.61195 78.77148 74.90080 78.68297 76.67795 I 77.03715 72.35041 70.49094 79.03109 73.64647 74.04143 79.20096 75.33028 79.11245 77.10743 J 68.27819 63.59145 61.73198 70.27213 64.88752 65.28247 70.44200 66.57132 70.35349 68.34847
解决方案
步骤1:拆分数据批次
将25个数据点按10/10/5的规则拆分行和列批次,对应区间为:
- 行批次:
1:10、11:20、21:25 - 列批次:
1:10、11:20、21:25
注:按此拆分共9个运算批次,是最直观且不易出错的拆分方式;若需严格7个批次,可将小批次合并(比如把21:25行与21:25列的运算合并到其他批次中),但9个批次的实现更简洁可靠。
步骤2:编写包装函数
下面的函数会自动遍历所有批次,调用matrix_function处理子矩阵,最后拼接成完整的25×25矩阵:
batch_matrix <- function(data) { # 定义行和列的拆分区间 row_batches <- list(1:10, 11:20, 21:25) col_batches <- list(1:10, 11:20, 21:25) # 初始化空的完整矩阵,设置行名和列名 full_matrix <- matrix(NA, nrow = nrow(data), ncol = nrow(data), dimnames = list(data$id, data$id)) # 遍历所有批次组合 for (i in seq_along(row_batches)) { for (j in seq_along(col_batches)) { # 获取当前批次的行、列索引 row_idx <- row_batches[[i]] col_idx <- col_batches[[j]] # 调用matrix_function生成子矩阵 sub_matrix <- matrix_function( x_id = data$id[row_idx], x = data$value[row_idx], y_id = data$id[col_idx], y = data$value[col_idx] ) # 将子矩阵填充到完整矩阵的对应位置 full_matrix[row_idx, col_idx] <- sub_matrix } } return(full_matrix) }
步骤3:测试函数
调用包装函数生成完整矩阵,可通过查看局部数据验证结果:
# 生成完整25×25矩阵 result <- batch_matrix(data) # 查看前10行前10列验证 result[1:10, 1:10]
内容的提问来源于stack exchange,提问作者Shibaprasad
相关产品推荐
相关产品推荐

