Julia中的数组排序

Ian*_*anH 3 arrays julia

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

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

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

sub(A, 1, 1:100)
Run Code Online (Sandbox Code Playgroud)

看起来有计划改进这一点,可以在https://github.com/JuliaLang/julia/issues/5513中看到

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

tho*_*oly 8

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

可能你想知道的主要问题是线性代数.目前,我不知道任何东西外的开箱,但要注意在朱莉娅矩阵乘法是通过一系列的功能,实现与喜欢的名字A_mul_B,At_mul_B,Ac_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)
Run Code Online (Sandbox Code Playgroud)

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

最后,Julia的transpose功能已经以缓存友好的方式实现,因此它比天真的快得多

for j = 1:n, i = 1:m
    At[j,i] = A[i,j]
end
Run Code Online (Sandbox Code Playgroud)

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

如果你实现这样的东西,我鼓励你把它作为一个包提供,因为其他人可能会感兴趣.