Julia 在行上迭代矩阵的推荐方法是什么?

Julia 在行上迭代矩阵的推荐方法是什么?,julia,Julia,给定一个矩阵m=[10i+j,对于i=1:3,j=1:4],我可以通过切片矩阵来迭代它的行: for i=1:size(m,1) print(m[i,:]) end 这是唯一的可能性吗?这是推荐的方式吗 那么理解呢?切片是迭代矩阵行的唯一可能性吗 [ sum(m[i,:]) for i=1:size(m,1) ] 您自己列出的解决方案以及mapslices,都可以正常工作。但如果“推荐”的真正含义是“高性能”,那么最好的答案是:不要迭代行 问题是,由于数组是按列的主顺序存储的,因此对

给定一个矩阵
m=[10i+j,对于i=1:3,j=1:4]
,我可以通过切片矩阵来迭代它的行:

for i=1:size(m,1)
    print(m[i,:])
end
这是唯一的可能性吗?这是推荐的方式吗

那么理解呢?切片是迭代矩阵行的唯一可能性吗

[ sum(m[i,:]) for i=1:size(m,1) ]

您自己列出的解决方案以及
mapslices
,都可以正常工作。但如果“推荐”的真正含义是“高性能”,那么最好的答案是:不要迭代行

问题是,由于数组是按列的主顺序存储的,因此对于小矩阵以外的任何矩阵,如果按行的主顺序遍历数组,结果都会很差

正如一篇文章中指出的,如果您想对多行进行求和,最好的办法是执行以下操作:

msum = zeros(eltype(m), size(m, 1))
for j = 1:size(m,2)
    for i = 1:size(m,1)
        msum[i] += m[i,j]
    end
end
我们以其本机存储顺序遍历
m
msum
,因此每次加载缓存线时,我们都使用所有值,从而产生1的缓存命中率。您可能天真地认为最好按行主顺序遍历它,并将结果累积到
tmp
变量,但在任何现代机器上,缓存未命中比
msum[i]
查找要昂贵得多


Julia的许多内部算法都采用了
区域
参数,比如
sum(m,2)
,可以为您处理这个问题。

根据我的经验,显式迭代比理解快得多

对列进行迭代也是一个很好的建议


此外,您还可以使用新的宏@simd和@inbounds来进一步加速它。

从Julia 1.1开始,有迭代器实用程序用于迭代矩阵的列或行。要在行上迭代,请执行以下操作:

M = [1 2 3; 4 5 6; 7 8 9]

for row in eachrow(af)
    println(row)
end
将输出:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

地图片<代码>贴图切片(总和,m,2)是否latter@jverzanimapslices完成了这项工作,尽管在某些情况下需要我定义一个匿名函数。谢谢你的建议。我想这回答了我的问题,我会再等一天接受答案。我非常喜欢这个答案,因为它让我意识到,由于Julia主修专栏,我最好将数据向量安排为列而不是行。你链接到的博客文章已不存在。请参阅。404似乎是由于尾部斜杠。这个URL有效:这是正确的。但是三维阵列呢?e、 g:
A[i,j,k]
。点什么菜
k-->j-->i
i-->j-->k
?是否有任何方法也可以使用此方法获取行索引?也就是说,不仅是每一行本身,还有它的index.Skumin,您可以在enumerate(eachrow(M))中为(i,row)使用
。实际上,您可以将
枚举
应用于任何迭代器