朱莉娅中的数组排序

4
有没有一种方法可以在Julia中本地使用C-ordered或非连续数组? 例如,在使用NumPy时,C-ordered数组是默认的,但我也可以初始化Fortran ordered数组并进行计算。 做到这一点的一种简单方法是对矩阵取转置。 我还可以使用通过切片制作的非连续数组。 我查看了文档等,找不到一种在Julia中创建、声明或处理C-ordered数组的方法。 转置似乎会返回一个副本。
Julia允许用户使用C-ordered和非连续数组吗? 当前是否有任何方法可以获得转置或切片而无需复制?
编辑:我已经找到如何进行切片。 目前它作为不同类型的SubArray可用。 例如,我可以执行以下操作以获取100x100数组A的第一行
sub(A, 1, 1:100)

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

这仍然存在C顺序数组的问题。 是否有C顺序数组的接口? 是否有通过视图而不是复制进行转置的方法?

1个回答

8
自然地,没有任何阻止您将行优先数组作为内存块来处理,某些包(如Images.jl)支持任意维度数组的任意排序。
您可能最关心的问题是线性代数。目前我不知道有什么现成的解决方案,但请注意,在Julia中,矩阵乘法是通过一系列函数实现的,这些函数的名称类似于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)

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

最后,Julia的transpose函数已以缓存友好的方式实现,因此比朴素方法快得多。

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

因此,有时不必担心创建算法的自定义实现,只需调用transpose即可。
如果您实现了这样的东西,我建议您将其作为软件包进行贡献,因为其他人可能也会感兴趣。

非常棒的答案。这正是我在寻找的。特别是涉及矩阵乘法的部分。我还不太熟悉Julia,但一旦我更熟悉这种语言,我可能会考虑制作那种类型。谢谢! - IanH
这个回复已经有将近3年的历史了,而Julia语言的数组专家Tim Holy现在已经有了一些非常好的新数组类型,可以用来允许行主序和0基(或任何基础!)的数组。 - Scott Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接