Julia中的数组排序

时间:2014-01-25 20:40:25

标签: arrays julia

有没有办法在Julia中原生使用C有序或非连续数组? 例如,当使用NumPy时,C顺序数组是默认值,但我可以初始化Fortran有序数组并使用它进行计算。 一个简单的方法是采用矩阵的转置。 我也可以使用通过切片制作的非连续数组。 我查看了文档等,无法在Julia中找到制作,声明或使用C有序数组的方法。 转置似乎会返回副本。

Julia允许用户使用C有序和非连续数组吗? 目前有没有办法在没有复制的情况下获得转置或切片?

编辑:我找到了如何进行切片。 目前,它可以作为一种称为SubArray的不同类型使用。 例如,我可以执行以下操作来获取100x100数组的第一行A

sub(A, 1, 1:100)

看起来有计划改进这一点,如https://github.com/JuliaLang/julia/issues/5513

中所示

这仍然留下了C排序数组的问题。 是否有C排序数组的接口? 有没有办法通过视图而不是副本进行转置?

1 个答案:

答案 0 :(得分:8)

当然,没有什么可以阻止你使用行主要数组作为一块内存,而某些包(如Images.jl)支持任意维数组的任意排序。

大概你想知道的主要问题是线性代数。目前我不知道任何开箱即用的东西,但请注意Julia中的矩阵乘法是通过一系列函数实现的,这些函数的名称为A_mul_BAt_mul_BAc_mul_Bc等,其中t表示转置​​,c表示共轭。 A'*b等表达式替换为Ac_mul_B(A, b)而不实际进行转置。

因此,您可以自己实现RowMajorMatrix <: AbstractArray类型,并设置特殊的乘法规则:

A_mul_B(A::RowMajorMatrix, B::RowMajorMatrix) = At_mul_Bt(A, B)
A_mul_B(A::RowMajorMatrix, B::AbstractArray) = At_mul_B(A, B)
A_mul_B(A::AbstractArray, B::RowMajorMatrix) = A_mul_Bt(A, B)

等。除了这两个参数版本之外,还有3个参数版本(如A_mul_B!),它们将结果存储在预先分配的输出中;你也需要实现它们。最后,您还必须设置适当的show方法(以适当地显示它们),size方法等。

最后,Julia的transpose函数已经以缓存友好的方式实现,所以它比天真的快得多

for j = 1:n, i = 1:m
    At[j,i] = A[i,j]
end

因此,在某些情况下,不值得担心创建自定义算法的实现,您只需调用transpose

如果您实施此类内容,我建议您将其作为一个包提供,因为其他人可能会感兴趣。