R语言矩阵变换:如何将奇偶行对应列元素相邻重组
解决R语言矩阵的行重组变换问题
嘿,我来帮你搞定这个矩阵变换需求!先回顾一下你的问题:我们有一个4×4的矩阵,需要把每偶数行上移,插入到前一奇数行的对应列右侧,最终得到指定结构的矩阵。
先确认原矩阵和目标结构
原矩阵定义:
text <- c(35, 1, 23, 17, 29, 3, 3, 31, 21, 15, 18, 22, 48, 0, 10, 42) mtr <- matrix(text, nrow = 4, ncol = 4)
原矩阵内容:
[,1] [,2] [,3] [,4] [1,] 35 29 21 48 [2,] 1 3 15 0 [3,] 23 3 18 10 [4,] 17 31 22 42
我们要把它转换成:
[,1] [,2] [,3] [,4] [1,] 35 1 29 3 [2,] 21 15 48 0 [3,] 23 17 3 31 [4,] 18 22 10 42
实现方法:分组转置重组
核心思路是把原矩阵按两行一组拆分,对每组进行转置后再重新排列成行,最后合并两组结果。具体代码如下:
# 定义原矩阵 text <- c(35, 1, 23, 17, 29, 3, 3, 31, 21, 15, 18, 22, 48, 0, 10, 42) mtr <- matrix(text, nrow = 4, ncol = 4) # 将矩阵拆分为两组:前两行和后两行 group1 <- mtr[1:2, ] group2 <- mtr[3:4, ] # 定义一个通用变换函数,处理每组两行的矩阵 transform_group <- function(mat) { # 1. 转置矩阵:把两行四列变成四行两列 # 2. 转成向量:按行提取所有元素,得到长度为8的向量 # 3. 重新组合成2行4列的矩阵:按行填充 matrix(as.vector(t(mat)), nrow = 2, byrow = TRUE) } # 对两组分别进行变换 transformed_group1 <- transform_group(group1) transformed_group2 <- transform_group(group2) # 合并两组结果得到最终矩阵 result <- rbind(transformed_group1, transformed_group2) # 查看结果 print(result)
代码逻辑解释
- 分组拆分:把4行矩阵拆成两个2行的子矩阵,分别处理前两行和后两行的配对。
- 转置重组:以第一组为例,
t(group1)会把原两行四列的矩阵转成四行两列:[,1] [,2]
[1,] 35 1
[2,] 29 3
[3,] 21 15
[4,] 48 0
接着`as.vector()`把转置后的矩阵按行转成向量:`c(35,1,29,3,21,15,48,0)`,最后用`matrix()`把这个向量重新分成2行4列,正好得到目标的前两行。 - **合并结果**:把两组变换后的矩阵上下拼接,就得到了最终的目标矩阵。 ### 更简洁的写法(可选) 如果不想拆分分组,也可以用一行代码完成(逻辑和上面一致,只是把分组操作整合到索引里),还能适配更多偶数行的矩阵(比如8行、12行): ```r result <- do.call(rbind, lapply(split(1:nrow(mtr), ceiling(1:nrow(mtr)/2)), function(i) { matrix(as.vector(t(mtr[i, ])), nrow = 2, byrow = TRUE) }))
内容的提问来源于stack exchange,提问作者Bourney
相关产品推荐
相关产品推荐

