Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 对于高维数组,使用数组访问的循环速度较慢_Loops_Multidimensional Array_Julia_Tensor - Fatal编程技术网

Loops 对于高维数组,使用数组访问的循环速度较慢

Loops 对于高维数组,使用数组访问的循环速度较慢,loops,multidimensional-array,julia,tensor,Loops,Multidimensional Array,Julia,Tensor,我在中描述并解决了相同的问题,其中julia循环由于使用非最佳变量类型重复访问内存而大大减慢。但在我的例子中,张量(维数大于2)存储为多维数组,需要在for循环中反复求和,类似于: function randomTensor(M,N) T = fill( zeros( M, M, M, M) , N) for i in 1 : N Ti = rand( M, M, M, M) T[i] += Ti end return T end

我在中描述并解决了相同的问题,其中julia循环由于使用非最佳变量类型重复访问内存而大大减慢。但在我的例子中,张量(维数大于2)存储为多维数组,需要在for循环中反复求和,类似于:

function randomTensor(M,N)
    T = fill( zeros( M, M, M, M) , N)
    for i in 1 : N
        Ti = rand( M, M, M, M)
        T[i] += Ti
    end
    return T
end
我是Julia的新手(事实上,我只是在一个特定的项目中使用它,我需要一些Julia模块),所以我对变量类型等只有一般的理解,直到现在我还不能定义我的张量,如果不是一般数组的话。我想要一个在前面的链接中提出的解决方案,他们使用
Matrix{Float64}[]
来定义变量,但显然这只适用于一维或二维数组。也不能使用元组,因为我需要对值求和。对于不同的实现有什么建议吗

提前谢谢大家


编辑:我发布的示例代码只是一个与我的代码结构相同的示例,我对生成和求和随机数不感兴趣:)
换句话说,我的问题是:有没有比数组{Float,N}更好的变量类型来执行操作(例如,张量乘以标量…)或者对内存有“更好的访问能力”?

问题是什么还不清楚。您的功能相当于:

randomTensor(M,N) = [rand(M, M, M, M) for i in 1:N]

你是说这太慢了?大部分时间应该用于创建随机数和为输出分配内存。

根据
M
的大小,您可能会注意到使用
+=
而不是
+=
的一些优势。原因是
x+=y
完全等同于
x=x+y
,包括分配一个新数组来保存结果。相反,
x.+=y
已就位。您可以通过以下方式自己看到这一点:

julia> a = [1,2,3]
3-element Vector{Int64}:
 1
 2
 3

julia> pointer(a)
Ptr{Int64} @0x00007fa007d2c980

julia> a += a
3-element Vector{Int64}:
 2
 4
 6

julia> pointer(a)
Ptr{Int64} @0x00007fa02a06eac0   # different pointer means new memory was allocated

julia> a .+= a
3-element Vector{Int64}:
  4
  8
 12

julia> pointer(a)
Ptr{Int64} @0x00007fa02a06eac0   # same pointer means memory re-use

这不是一个答案,我同意克里斯托弗的回答,但请注意,在您链接的答案中,问题是数组被实例化为
Array[]
,这意味着它们没有类型。在您的例子中,
zero(M,M,M,M)
返回一个
数组{Float64,4}
,因此是一个包含
Float64
(类型化)元素的四维数组。当N占主导地位,且M很小时,您可以通过创建一个
randn(M^4*N)
数组并查看其重塑部分来节省一些时间。但是当M达到任何非小的大小时,
rand
将占主导地位。我发布的示例代码只是一个具有相同代码结构的示例,我对生成和求和随机数不感兴趣:)换句话说,我的问题是:是否有比数组{Float,N}更好的变量类型来执行操作(例如张量乘以标量…)或对内存有“更好的访问”的?