如何通过重复矩阵行实现矩阵扩容?附实例与实现代码
如何实现矩阵每行重复指定次数的扩容
嘿,这个需求其实有好几种直观的实现方式,我给你拆解一下~咱们以你给出的初始矩阵 A = [1 2 3; 4 5 6; 7 8 9] 为例,目标是把每一行重复3次得到9×3的矩阵B。
方法1:用repelem函数(最直观)
MATLAB从R2015a版本开始提供了repelem函数,专门用来按元素/行/列重复数组,语法非常直白:
A = [1 2 3; 4 5 6; 7 8 9]; repeat_times = 3; % 每行重复的次数 B = repelem(A, repeat_times, 1);
- 第二个参数
repeat_times指定行方向的重复次数,这里所有行都重复3次; - 第三个参数
1表示列方向不重复; - 运行后直接得到你想要的结果:每行连续重复3次的矩阵B。
方法2:用kron克罗内克积
如果你习惯用矩阵运算的思路,克罗内克积也能轻松实现这个效果:
A = [1 2 3; 4 5 6; 7 8 9]; B = kron(A, ones(3, 1));
ones(3,1)是一个3行1列的全1矩阵;- 克罗内克积
kron(A, M)会把A的每个元素和矩阵M做“扩展相乘”,对于整行来说,就相当于把A的每一行重复3次(因为和全1矩阵相乘,行元素会被复制3次)。
方法3:拆解你提到的permute+replicate思路
你给出的代码B = replicate(permute(A,[3 2 1]),3,1)其实是利用维度变换来实现重复,咱们拆解一下逻辑:
permute(A,[3 2 1]):把原二维矩阵A(维度为[3,3])转换成三维数组,维度变为[1,3,3](相当于把原行维度转到了第三个维度);replicate(...,3,1):在第一个维度上重复3次,得到维度为[3,3,3]的三维数组;- 最后再把维度转回来,就能得到每行重复3次的二维矩阵。
不过这里要注意:MATLAB里没有原生的replicate函数,大概率是repelem的笔误,修正后的完整代码可以是:
A = [1 2 3; 4 5 6; 7 8 9]; B = permute(repelem(permute(A,[3 2 1]),3,1), [3 2 1]);
这种方式适合理解数组维度的变换逻辑,不过相比前两种方法稍显繁琐。
内容的提问来源于stack exchange,提问作者user9003011
相关产品推荐
相关产品推荐

