将函数应用于矩阵的每一列

问题描述 投票:0回答:2

将函数应用于矩阵的每一列(或行)的最有效、最简洁的方法是什么?

假设我有一个矩阵,为了简化,有一个最小工作矩阵:

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 文档中的哪些关键字自己找到它吗?

matrix julia
2个回答
5
投票

您正在寻找

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。


0
投票

这非常有帮助。为了好玩,我不想将一个字符中所有字符的 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!
© www.soinside.com 2019 - 2024. All rights reserved.