Julia如何沿矩阵特定轴向量化执行函数?可否通过点语法实现?
Julia 沿指定维度操作矩阵的实现方法
你写的sum.(ones(4,4))没有得到预期结果,是因为点语法是Julia的广播机制,作用是把函数逐个应用到数组的每一个独立元素上,上述代码等价于对4×4矩阵里的每个1单独执行求和操作,最终输出还是4×4的全1矩阵,和按行/列聚合的需求不符。
内置聚合函数的最优实现
Julia所有内置的统计聚合函数(包括sum、mean、maximum、std等)都原生支持dims关键字参数,直接指定操作维度即可,这是性能最优的实现方式,底层做了高度向量化优化:
- 按行求和(对每行的所有列元素聚合,保留维度结构):
sum(ones(4,4), dims=2) # 输出为4×1矩阵,每个元素对应原矩阵一行的求和结果 - 按列求和(对每列的所有行元素聚合,保留维度结构):
sum(ones(4,4), dims=1) # 输出为1×4矩阵,每个元素对应原矩阵一列的求和结果
如果不需要保留聚合后的维度,想要输出一维向量,可以搭配dropdims方法消去冗余维度:
# 按行求和后输出长度为4的一维向量 dropdims(sum(ones(4,4), dims=2), dims=2)
自定义函数沿指定维度应用的通用方法
如果需要应用自定义函数而非内置聚合函数,可以用eachslice方法按指定维度切分矩阵得到切片迭代器,再搭配广播或者map执行函数,编译后性能和手写循环一致:
# 自定义函数示例:计算每行的最大值减最小值 f(row) = maximum(row) - minimum(row) # 对所有行应用函数,输出长度为4的一维向量 f.(eachslice(ones(4,4), dims=1))
内容的提问来源于stack exchange,提问作者bonfab
相关产品推荐
相关产品推荐

