如何对张量中的矩阵元素执行类似repelem的重复操作?
实现MATLAB中张量第三维度切片的逐元素重复(无循环)
需求回顾
已有m×n的矩阵A、B、C,拼接为m×n×3的张量P = cat(3, A, B, C),需要将每个第三维度的切片连续重复K次,生成m×n×3K的张量(例如K=2时,结果为cat(3, A, A, B, B, C, C)),要求使用内置函数、无循环且效率不低于手动拼接。
解决方案
以下两种方法均为矢量化内置函数操作,满足需求且效率优异:
方法1:索引重复(最简洁直观)
通过repelem生成重复的第三维度索引,直接索引原张量即可:
P = cat(3, A, B, C); idx = repelem(1:size(P,3), K); % 生成重复索引,如K=2时为[1,1,2,2,3,3] Q = P(:,:,idx);
该方法利用MATLAB优化后的索引操作实现切片连续重复,代码简洁,效率远高于循环,甚至优于多次手动cat拼接。
方法2:reshape与permute组合
通过扩展维度、交换维度再合并的方式实现:
P = cat(3, A, B, C); % 先将每个切片复制K次,扩展为m×n×3×K的张量 temp = repmat(P, 1, 1, 1, K); % 交换第三、第四维度,将重复切片调整为连续排列,再合并后两个维度 Q = reshape(permute(temp, [1 2 4 3]), size(P,1), size(P,2), []);
该方法通过维度变换实现需求,适合需要对维度操作有更精细控制的场景,效率同样出色。
验证示例
当K=2时,两种方法生成的Q均等价于cat(3, A, A, B, B, C, C),完全符合需求。
内容的提问来源于stack exchange,提问作者ummg
相关产品推荐
相关产品推荐

