arrays - 在 Julia 1.0 中对特征值/特征向量进行排序

标签 arrays sorting julia

这个问题并不是需要解决方案,而是问我的方法对于 Julia 语言是否自然(Julianic?),如果不是,什么是更自然的实现:

@doc """
function sorteigen!(evals::Array{Number,1},evecs::Array{Number,2})

Sort the eigenvalues and vectors.
"""
function sorteigen!(evals::Array{Number,1},evecs::Array{Number,2})
n=size(evecs)[1];

#Shallow copy and force local scope
local sortedevals = copy(evals);
local sortedevecs = copy(evecs);

#Sort eigenvalue Array{Number,1}
sortedindex = sortperm(evals);
evals[:] = sortedevals[sortedindex];

#Sort eigenvectors
for i=1:n
    sortedevecs[:,i] = evecs[:,sortedindex[i]];
end

evecs[:,:] = sortedevecs[:,:]

end

最佳答案

在这种情况下我会创建一个非变异函数:

function sorteigen(evals::Vector{T},evecs::Matrix{T}) where {T<:Real}
    p = sortperm(evals)
    evals[p], evecs[:, p]
end

如果您确实需要节省内存,那么您可以执行以下就地操作的操作:

function sorteigen!(evals::Vector{T},evecs::Matrix{T}) where {T<:Real}
    p = sortperm(evals)
    s = similar(evals)
    for i in axes(evecs, 1)
        for (j, pv) in enumerate(p)
            @inbounds s[pv] = evecs[i, j]
        end
        for j in eachindex(s)
            @inbounds evecs[i, j] = s[j]
        end
    end
    sort!(evals), evecs
end

它将提高内存效率,但可能会更慢,因为我们按行操作,因此无法应用 SIMD。

另请注意,我在方法的签名中使用 Real,因为一般 Number 不必定义顺序(特别是复数)。

关于arrays - 在 Julia 1.0 中对特征值/特征向量进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54961540/

相关文章:

arrays - 如何在 Julia 中使用数组和参数 NTuple 的联合作为函数参数类型?

java - 在 10x10 二维数组中完成的数学运算无法正确计算

arrays - 如何在 UILocalNotification 中使用随机文本?

mysql - 使用 x=x+1 值更新 mysql 中的 20 行?

ruby - 在 Ruby 中,如何将一个多维数组按另一个多维数组排序?

python - 如何按 Pandas 中的时间戳排序?

java - 当我运行代码时,我得到 (0, null) 并且无法弄清楚为什么

c# - .Net 垃圾收集器中写入障碍的详细信息

julia - 如何使用 Juno 在 Atom 中调试 Julia 代码?

dataframe - 将 .txt 作为日期类型读入 Julia DataFrame