将函数应用于矩阵的每一列(或行)的最有效、最简洁的方法是什么?
假设我有一个矩阵,为了简化,有一个最小工作矩阵:
julia> mtx
4×2 Array{Float64,2}:
1.0 8.0
-Inf 5.0
5.0 -Inf
9.0 9.0
假设您必须将
sortperm
应用于 mtx
的每一列。
当然可以通过以下方式完成:
for i in 1:size(mtx)[2]
mtx[:,i] = sortperm(mtx[:,i])
end
julia> mtx
4×2 Array{Float64,2}:
2.0 3.0
1.0 2.0
3.0 1.0
4.0 4.0
但是有没有更简洁的方法,使用
map
或类似的东西?最后,您能告诉我如何通过搜索 Julia 文档中的哪些关键字自己找到它吗?
mapslices
:
julia> mtx = [1.0 8.0;-Inf 5.0;5.0 -Inf;9.0 9.0]
4×2 Array{Float64,2}:
1.0 8.0
-Inf 5.0
5.0 -Inf
9.0 9.0
julia> mapslices(sortperm, mtx; dims=1) # apply sortperm to every column of mtx
4×2 Array{Int64,2}:
2 3
1 2
3 1
4 4
摘自文档:
使用函数 f 变换数组 A 的给定维度。 f 在 A[...,:,...,:,...] 形式的 A 的每个切片上调用。 dims 是一个整数向量,指定冒号在此表达式中的位置。结果沿其余维度串联。例如,如果 dims 为 [1,2] 并且 A 为 4 维,则对于所有 i 和 j,在 A[:,:,i,j] 上调用 f。
这非常有帮助。为了好玩,我不想将一个字符中所有字符的 ascii 代码总结在一行中,它帮助我弄清楚了。 x 是一个字符串,例如“MyImage.gif”:
#y = collect(x)
#leny = length(y)
#Ltot = 0 # leny
#for i = 1 : leny
# Ltot += Int32(y[i])
#end
Ltot = sum(map(Int32, collect(x))) # Fun!