如何按自定义行选取规则行向合并矩阵生成新矩阵?
嘿,这个按固定行块循环合并矩阵的需求,其实用矩阵拆分+按顺序拼接就能轻松搞定!我给你分别用MATLAB和Python(numpy)两种常用工具来实现,逻辑都是一致的~
MATLAB实现
首先先定义好三个原始矩阵:
A = [1 2 3; 4 5 6; 7 8 9]; B = [10 11 12; 13 14 15; 16 17 18; 19 20 21; 22 23 24; 25 26 27]; C = [28 29 30; 31 32 33; 34 35 36; 37 38 39; 40 41 42; 43 44 45; 46 47 48; 49 50 51; 52 53 54];
接下来把每个矩阵按需求拆分成对应大小的行块:
- A要拆成3个1行3列的块(刚好对应3次循环)
- B要拆成3个2行3列的块
- C要拆成3个3行3列的块
用mat2cell函数就能完成拆分:
A_blocks = mat2cell(A, ones(1,3), 3); % 每个块1行 B_blocks = mat2cell(B, 2*ones(1,3), 3); % 每个块2行 C_blocks = mat2cell(C, 3*ones(1,3), 3); % 每个块3行
最后循环拼接每个循环单元(A块→B块→C块),逐步构建目标矩阵D:
D = []; for i = 1:3 D = [D; A_blocks{i}; B_blocks{i}; C_blocks{i}]; end
运行后得到的D就是你想要的合并矩阵啦!
Python(numpy)实现
如果用Python的话,借助numpy库的矩阵操作会非常方便:
先导入numpy并定义原始矩阵:
import numpy as np A = np.array([[1,2,3],[4,5,6],[7,8,9]]) B = np.array([[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27]]) C = np.array([[28,29,30],[31,32,33],[34,35,36],[37,38,39],[40,41,42],[43,44,45],[46,47,48],[49,50,51],[52,53,54]])
用np.split函数按行拆分矩阵:
A_blocks = np.split(A, 3, axis=0) # 拆成3个(1,3)的子数组 B_blocks = np.split(B, 3, axis=0) # 拆成3个(2,3)的子数组 C_blocks = np.split(C, 3, axis=0) # 拆成3个(3,3)的子数组
最后用列表推导式+垂直拼接完成合并:
# 先拼接每个循环单元,再把所有单元拼起来 D = np.vstack([np.vstack([A_blocks[i], B_blocks[i], C_blocks[i]]) for i in range(3)])
打印D就能看到和需求一致的结果啦~
补充说明
这个方法的核心是保证三个矩阵的行数刚好是循环次数的整数倍:A行数=循环次数×1,B行数=循环次数×2,C行数=循环次数×3。这里循环次数是3,完美匹配你的数据。如果以后数据行数变化,只要调整循环次数和拆分的块大小就能复用这个逻辑哦!
内容的提问来源于stack exchange,提问作者user9003011
相关产品推荐
相关产品推荐

