有没有办法在 Julia 中以 O(1) 的时间交换列?

Fra*_*rio 4 linear-algebra numerical-methods julia

我选择 Julia 来做一些数值分析工作,并尝试实现完整的主元 LU 分解(例如,尝试获得尽可能稳定的 LU 分解)。我认为最好的方法是找到每列的最大值,然后按最大值的降序排列这些列。

有没有办法避免交换两列的每个元素,而是执行诸如更改两个引用/指针之类的操作?

crs*_*nbr 5

只是为了“完整性”,如果您确实想就地交换列,

function swapcols!(X::AbstractMatrix, i::Integer, j::Integer)
    @inbounds for k = 1:size(X,1)
        X[k,i], X[k,j] = X[k,j], X[k,i]
    end
end
Run Code Online (Sandbox Code Playgroud)

简单快捷。

事实上,在小矩阵的单独基准测试中,这甚至比view其他答案中提到的方法更快(视图并不总是免费的):

julia> A = rand(1:10,4,4);

julia> @btime view($A, :, $([3,2,1,4]));
  31.919 ns (3 allocations: 112 bytes)

julia> @btime swapcols!($A, 1,3);
  8.107 ns (0 allocations: 0 bytes)
Run Code Online (Sandbox Code Playgroud)