如何无需条件判断动态创建d维张量?求高效实现方案
高效实现d维对角张量的方法(无分支判断)
当然有!你可以利用MATLAB的向量化索引操作来实现这个需求,完全不需要条件判断,而且代码更简洁、执行效率更高,甚至可以轻松扩展到任意维度d(不止2或3)。
核心实现代码
% 输入参数 d = 3; % 可以是2,也可以是其他正整数 r = 5; % 每个维度的大小 % 创建d维全零张量 B = zeros(ones(1, d) * r); % 直接选中所有维度索引相等的位置,赋值为1 B(repmat({1:r}, 1, d)) = 1;
代码解释
- 创建全零张量:
zeros(ones(1, d)*r)会生成一个d维、每个维度长度都是r的全零张量,不管d是2还是3,这一步都通用。 - 智能索引赋值:
repmat({1:r}, 1, d)会生成一个包含d个元素的cell数组,每个元素都是1:r的向量。用这个cell数组作为索引时,MATLAB会自动选取所有满足(i,i,...,i)的位置(也就是d维张量的"对角线"元素),直接赋值为1即可。
为什么这比原方法更好?
- 无分支判断:不需要写
if/elseif,代码更简洁,也避免了分支判断带来的维护成本。 - 向量化高效:MATLAB对向量化操作的优化远优于显式
for循环,执行速度更快。 - 扩展性强:不管d是2、3还是更大的维度,这段代码都能直接运行,不需要修改。
举个例子,当d=2时,这段代码会生成一个r×r的单位矩阵;当d=3时,会生成一个r×r×r的张量,其中只有(i,i,i)位置是1,其余为0,完全符合你的需求。
内容的提问来源于stack exchange,提问作者baptiste
相关产品推荐
相关产品推荐

