如何生成首行首列固定为0,1,2的3x3矩阵并验证关联条件
问题解决:筛选满足特定条件的3x3矩阵
需求梳理
- 生成所有元素取自
{0,1,2}的3x3矩阵 - 筛选首行和首列固定为
[0,1,2]的矩阵 - 验证并保留满足以下关联条件的矩阵:
- 对任意
i,j,k ∈ {0,1,2},计算m = (i+j) mod 3,需满足a_ij = m且a_mk = (m+k) mod 3 - 计算
n = (j+k) mod 3,需满足a_jk = n且a_in = (i+n) mod 3 - 最终要求
a_mk = a_in
- 对任意
完善后的代码
from itertools import product import numpy as np # 生成所有元素为0、1、2的3x3矩阵,转换为整数类型 all_matrices = [np.array(list(i)).reshape(3, 3).astype(int) for i in product("012", repeat=9)] print(f"总矩阵数量: {len(all_matrices)}") # 筛选首行、首列固定为[0,1,2]的矩阵 filtered_matrices = [] for mat in all_matrices: if (mat[0] == [0,1,2]).all() and (mat[:,0] == [0,1,2]).all(): filtered_matrices.append(mat) print(f"首行首列符合要求的矩阵数量: {len(filtered_matrices)}") # 验证关联条件,保留符合要求的矩阵 valid_matrices = [] for mat in filtered_matrices: is_valid = True # 遍历所有i,j,k的组合 for i in range(3): for j in range(3): for k in range(3): # 验证i+j = a_ij(取模3适配元素范围) m = (i + j) % 3 if mat[i][j] != m: is_valid = False break # 验证m+k = a_mk expected_mk = (m + k) % 3 if mat[m][k] != expected_mk: is_valid = False break # 验证j+k = a_jk n = (j + k) % 3 if mat[j][k] != n: is_valid = False break # 验证i+n = a_in expected_in = (i + n) % 3 if mat[i][n] != expected_in: is_valid = False break # 验证a_mk == a_in if mat[m][k] != mat[i][n]: is_valid = False break if not is_valid: break if not is_valid: break if is_valid: valid_matrices.append(mat) print(f"符合所有条件的矩阵数量: {len(valid_matrices)}") # 输出所有符合条件的矩阵 print("符合条件的矩阵:") for idx, mat in enumerate(valid_matrices): print(f"矩阵{idx+1}:") print(mat) print()
关键改进说明
- 修正矩阵元素类型:将生成的字符串元素转为整数,避免类型不匹配的计算问题
- 优化筛选逻辑:直接检查首行、首列是否完全匹配
[0,1,2],避免原代码重复添加矩阵的错误 - 补充完整验证逻辑:遍历所有
i,j,k组合,严格按照需求逐一验证每个关联条件,同时通过取模3确保计算结果符合矩阵元素的取值范围
内容的提问来源于stack exchange,提问作者Prakash P
相关产品推荐
相关产品推荐

