Я бы сделал немутирующую функцию в этом случае:
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
необязательно определять порядок (в частности, комплексные числа).