有没有办法在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排序数组的接口? 有没有办法通过视图而不是副本进行转置?
答案 0 :(得分:8)
当然,没有什么可以阻止你使用行主要数组作为一块内存,而某些包(如Images.jl)支持任意维数组的任意排序。
大概你想知道的主要问题是线性代数。目前我不知道任何开箱即用的东西,但请注意Julia中的矩阵乘法是通过一系列函数实现的,这些函数的名称为A_mul_B
,At_mul_B
,Ac_mul_Bc
等,其中t
表示转置,c
表示共轭。 1}}将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
。
如果您实施此类内容,我建议您将其作为一个包提供,因为其他人可能会感兴趣。