如何通过通用矩阵扩展算法,应用元素方阵映射得到二维输出矩阵
实现方法
这个操作本质是对原矩阵的每个元素做自定义映射后做块拼接,效果等价于带自定义生成规则的克罗内克积,最终输出的矩阵尺寸为原矩阵行数×小矩阵阶数 × 原矩阵列数×小矩阵阶数。
纯Python实现(无第三方依赖)
from typing import List, Tuple # 你提供的expand函数 def expand(v: int) -> Tuple[Tuple[float, float], Tuple[float, float]]: return ((1.1, 2.2), (3.3, 4.4)) # 原矩阵 M = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] # 先获取expand生成的小方阵的阶数 k = len(expand(0)) result = [] for raw_row in M: # 初始化当前原行对应的k行块 block_rows = [[] for _ in range(k)] for val in raw_row: small_mat = expand(val) # 把小矩阵的每行拼到对应块行的末尾 for idx in range(k): block_rows[idx].extend(small_mat[idx]) # 把当前块的所有行追加到最终结果 result.extend(block_rows) # 输出验证尺寸,示例中应为6行6列 print(len(result), len(result[0])) print(result)
Numpy简洁实现
如果允许使用第三方库,用numpy的block方法可以快速完成块拼接:
import numpy as np from typing import Tuple def expand(v: int) -> Tuple[Tuple[float, float], Tuple[float, float]]: return ((1.1, 2.2), (3.3, 4.4)) M = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] # 先生成按块排列的小矩阵列表 block_grid = [[expand(val) for val in row] for row in M] # 直接拼接为二维矩阵 result = np.block(block_grid) # 转为普通列表可选 print(result.tolist())
两种方法最终输出的都是符合要求的6×6二维矩阵,不会生成四维中间结构。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

