Octave中数组按向量元素逐元素幂次求和的向量化实现方案
最优实现方案
R2016b及以上版本(推荐)
直接利用Matlab原生的隐式广播特性,代码仅有一行,大幅简化原有实现:
sum(A .^ reshape(p, [ones(1,ndims(A)), length(p)]), ndims(A)+1)
实现逻辑说明
- 首先把向量
p重塑为维度为[1,1,...,length(p)]的高维数组,新增维度和A的原有维度完全不重叠 - 隐式广播会自动将
A和重塑后的p扩展到维度匹配的状态,无需手动调用repmat做重复复制 - 沿新增的最后一维求和后,输出结果的尺寸和输入
A完全一致,支持任意维度的A和任意长度的p,全向量化操作无循环
示例验证
用你给出的测试用例验证:
输入:
A = [0 1 ; 2 3]; p = [2 3];
运行上述代码得到的结果为:
0 2 12 36
和预期输出完全匹配。
R2016b之前版本兼容方案
如果需要兼容不支持隐式广播的旧版Matlab,用bsxfun实现,同样比双层repmat写法简洁很多:
sum(bsxfun(@power, A, reshape(p, [ones(1,ndims(A)), length(p)])), ndims(A)+1)
内容的提问来源于stack exchange,提问作者smcmi
相关产品推荐
相关产品推荐

