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

R语言中统计多矩阵与全排列矩阵行匹配次数并生成结果矩阵

解决方案:生成排列匹配计数矩阵

我来帮你搞定这个问题!核心逻辑很清晰:先统计每个输入矩阵里各类排列的出现次数,再把这些次数对应到矩阵A的每一行上,最后把所有输入矩阵的统计结果组合成目标维度的矩阵。下面我用R和Python两种常用工具分别实现,你可以按需选用。

用R实现

步骤说明

  1. 生成包含所有排列的矩阵A;
  2. 定义输入矩阵列表;
  3. 编写函数统计单个输入矩阵与A每行的匹配次数;
  4. 批量处理所有输入矩阵,组合成结果矩阵(可按需转置调整维度)。

代码示例

# 安装并加载生成排列的工具包
if (!require(gtools)) {
  install.packages("gtools")
  library(gtools)
}

# 设定D值(示例中D=3)
D <- 3

# 生成矩阵A:包含1到D的所有排列
A <- permutations(n = D, r = D)

# 定义输入矩阵(示例中的B和C,实际可替换为你的D个矩阵)
B <- matrix(c(1,2,3, 1,2,3, 3,2,1), nrow = 3, byrow = TRUE)
C <- matrix(c(2,1,3, 1,2,3, 2,3,1), nrow = 3, byrow = TRUE)
input_matrices <- list(B, C)  # 这里放你的D个矩阵

# 定义统计匹配次数的函数
count_matches <- function(mat, A) {
  # 将矩阵转为数据框,方便用字符串拼接标识唯一排列
  mat_df <- as.data.frame(mat)
  A_df <- as.data.frame(A)
  
  # 统计输入矩阵中每个排列的出现次数
  mat_counts <- table(do.call(paste, mat_df))
  
  # 遍历A的每一行,获取对应排列的出现次数(无匹配则为0)
  sapply(1:nrow(A), function(j) {
    perm_key <- paste(A[j, ], collapse = " ")
    ifelse(perm_key %in% names(mat_counts), mat_counts[perm_key], 0)
  })
}

# 批量处理所有输入矩阵,生成结果矩阵
result <- do.call(rbind, lapply(input_matrices, count_matches, A = A))

# 如果需要D!×D的维度(行对应A的排列,列对应输入矩阵),只需转置
result_Dfact_x_D <- t(result)

# 查看结果
print(result_Dfact_x_D)

用Python实现

步骤说明

  1. 用itertools生成所有排列构建矩阵A;
  2. 把A的每行转为元组(方便作为字典键);
  3. 用Counter统计每个输入矩阵的排列出现次数;
  4. 映射到A的所有排列,生成结果矩阵(按需转置)。

代码示例

import itertools
from collections import Counter
import numpy as np

# 设定D值(示例中D=3)
D = 3

# 生成矩阵A:包含1到D的所有排列,同时转为元组列表用于后续匹配
A = np.array(list(itertools.permutations(range(1, D+1))))
A_tuples = [tuple(row) for row in A]

# 定义输入矩阵(示例中的B和C,实际替换为你的D个矩阵)
B = np.array([[1,2,3], [1,2,3], [3,2,1]])
C = np.array([[2,1,3], [1,2,3], [2,3,1]])
input_matrices = [B, C]  # 这里放你的D个矩阵

# 定义统计匹配次数的函数
def count_matches(mat, A_tuples):
    # 将输入矩阵的每行转为元组
    mat_tuples = [tuple(row) for row in mat]
    # 统计每个排列的出现次数
    perm_counts = Counter(mat_tuples)
    # 对应到A的每个排列,返回次数列表
    return [perm_counts.get(perm, 0) for perm in A_tuples]

# 批量处理所有输入矩阵,生成结果矩阵
result = np.array([count_matches(mat, A_tuples) for mat in input_matrices])

# 转置得到D!×D维度的矩阵(行对应A的排列,列对应输入矩阵)
result_Dfact_x_D = result.T

# 查看结果
print(result_Dfact_x_D)

示例输出解释

以示例中的B和C为例,转置后的result_Dfact_x_D是6×2的矩阵(对应D!=6,D=3中的2个矩阵):

  • 第一列是B矩阵与A每行的匹配次数:[2, 0, 0, 0, 0, 1],表示B中有2行和A的第一行相同,1行和A的第六行相同;
  • 第二列是C矩阵与A每行的匹配次数:[1, 0, 1, 1, 0, 0],表示C各有1行分别匹配A的第1、3、4行。

内容的提问来源于stack exchange,提问作者Jorge Mendoza Ruiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:03:28