gpt4 book ai didi

arrays - Julia 中的数组排序

转载 作者:行者123 更新时间:2023-12-01 09:27:10 25 4
gpt4 key购买 nike

有没有办法在 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 有序数组的接口(interface)?
有没有办法通过 View 而不是副本进行转置?

最佳答案

自然,没有什么可以阻止您将行主要数组作为一 block 内存使用,并且某些包(如 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。 .

如果你实现了这样的东西,我鼓励你将它作为一个包贡献出来,因为其他人可能会感兴趣。

关于arrays - Julia 中的数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com