如何在 Julia 中标准化矩阵的列

Eva*_*n E 4 linear-algebra numerical-methods julia

给定一个维度为 m,n 的矩阵 A,如何通过 Julia 中的某个函数或其他过程对该矩阵的列进行归一化(目标是对 A 的列进行归一化,以便我们的新矩阵的列长度为 1)?

DNF*_*DNF 5

mapslices似乎在性能方面存在一些问题。在我的计算机(和 v1.7.2)上,速度快了 20 倍:

x ./ norm.(eachcol(x))'
Run Code Online (Sandbox Code Playgroud)

这是一个就地版本(因为eachcol创建了视图),速度更快(但仍然分配了一点):

normalize!.(eachcol(x))
Run Code Online (Sandbox Code Playgroud)

最后,一些循环版本比mapslices5x3 矩阵快 40-70 倍:

# works in-place:
function normcol!(x)
    for col in eachcol(x)
        col ./= norm(col)
    end
    return x
end
# creates new array:
normcol(x) = normcol!(copy(x))
Run Code Online (Sandbox Code Playgroud)

编辑:添加了零分配的单行:

foreach(normalize!, eachcol(x))
Run Code Online (Sandbox Code Playgroud)

与 不同,它不分配任何内容的原因normalize!.是它foreach不返回任何内容,这使得它在不需要输出的情况下很有用。