在 Julia 中制作二维晶格

ten*_*ten 9 arrays vector matrix multidimensional-array julia

语境

\n

让我们考虑 5 x 5 格子,每个点索引为 (1,1),(1,2),...(1,5),(2,1),...,(5,5),并且称此为格子L

\n

我想做的事

\n

我想制作一个 5 x 5 矩阵,每个元素都有一个值来指示每个点,L如下所示:

\n
5\xc3\x975 Matrix{Vector{Int64}}:\n [1, 1]  [1, 2]  [1, 3]  [1, 4]  [1, 5]\n [2, 1]  [2, 2]  [2, 3]  [2, 4]  [2, 5]\n [3, 1]  [3, 2]  [3, 3]  [3, 4]  [3, 5]\n [4, 1]  [4, 2]  [4, 3]  [4, 4]  [4, 5]\n [5, 1]  [5, 2]  [5, 3]  [5, 4]  [5, 5]\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过的

\n

我刚刚尝试了以下操作:

\n
X1 = [1,2,3,4,5]\nX2 = copy(X1)\nLattice = Matrix{Vector{Int64}}(undef, length(X1), length(X2)) # what I want to make\nfor x1 in X1\n    for x2 in X2\n        Lattice[x1,x2] = [X1[x1],X2[x2]]\n    end\nend\n\nLattice\n
Run Code Online (Sandbox Code Playgroud)\n

问题

\n
    \n
  • 还有其他方法可以使代码变得简单或简短吗?
  • \n
  • 我担心当增加晶格尺寸(如 50 x 50)时性能会变差。有更好的方法吗?
  • \n
  • 有什么更好的做法吗?
  • \n
\n

任何信息,将不胜感激。

\n

Bat*_*aBe 11

它不是向量矩阵,但笛卡尔索引可以实现此目的。

\n
L = zeros((5,5)) # example 5x5 Matrix\n\nLi = CartesianIndices(size(L))\n#=\n5\xc3\x975 CartesianIndices{2,Tuple{Base.OneTo{Int64},Base.OneTo{Int64}}}:\n CartesianIndex(1, 1)  \xe2\x80\xa6  CartesianIndex(1, 5)\n CartesianIndex(2, 1)     CartesianIndex(2, 5)\n CartesianIndex(3, 1)     CartesianIndex(3, 5)\n CartesianIndex(4, 1)     CartesianIndex(4, 5)\n CartesianIndex(5, 1)     CartesianIndex(5, 5)\n=#\n
Run Code Online (Sandbox Code Playgroud)\n

如果您必须像帖子中那样拥有索引矩阵,您可以创建一个将 CartesianIndex 转换为 Vector 的方法,并通过 CartesianIndices 广播该方法:

\n
CItoVector(CI) = collect(Tuple(CI))\n\nCItoVector.(Li)\n#=\n5\xc3\x975 Array{Array{Int64,1},2}:\n [1, 1]  [1, 2]  [1, 3]  [1, 4]  [1, 5]\n [2, 1]  [2, 2]  [2, 3]  [2, 4]  [2, 5]\n [3, 1]  [3, 2]  [3, 3]  [3, 4]  [3, 5]\n [4, 1]  [4, 2]  [4, 3]  [4, 4]  [4, 5]\n [5, 1]  [5, 2]  [5, 3]  [5, 4]  [5, 5]\n=#\n
Run Code Online (Sandbox Code Playgroud)\n

但我建议坚持使用 CartesianIndices,因为它不分配内存,而且 CartesianIndex 是为数组索引量身定制的,这似乎是您的意图。

\n


fre*_*kre 10

您可以使用数组理解

\n
julia> N = 5;\n\njulia> L = [[i, j] for i in 1:N, j in 1:N]\n5\xc3\x975 Matrix{Vector{Int64}}:\n [1, 1]  [1, 2]  [1, 3]  [1, 4]  [1, 5]\n [2, 1]  [2, 2]  [2, 3]  [2, 4]  [2, 5]\n [3, 1]  [3, 2]  [3, 3]  [3, 4]  [3, 5]\n [4, 1]  [4, 2]  [4, 3]  [4, 4]  [4, 5]\n [5, 1]  [5, 2]  [5, 3]  [5, 4]  [5, 5]\n
Run Code Online (Sandbox Code Playgroud)\n


Bog*_*ski 5

BatWannaBe 推荐的是我这样做的方式,但作为参考,这里是如何使用广播获得您所要求的内容vcat

\n
julia> vcat.(1:5, (1:5)')\n5\xc3\x975 Matrix{Vector{Int64}}:\n [1, 1]  [1, 2]  [1, 3]  [1, 4]  [1, 5]\n [2, 1]  [2, 2]  [2, 3]  [2, 4]  [2, 5]\n [3, 1]  [3, 2]  [3, 3]  [3, 4]  [3, 5]\n [4, 1]  [4, 2]  [4, 3]  [4, 4]  [4, 5]\n [5, 1]  [5, 2]  [5, 3]  [5, 4]  [5, 5]\n
Run Code Online (Sandbox Code Playgroud)\n