在 Julia 中制作二维晶格

Posted

技术标签:

【中文标题】在 Julia 中制作二维晶格【英文标题】:Make a 2-dimensional lattice in Julia 【发布时间】:2022-01-16 20:05:09 【问题描述】:

上下文

让我们考虑 5 x 5 晶格,每个点的索引为 (1,1),(1,2),...(1,5),(2,1),...,(5,5 ),并称这个格为L

我想做什么

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

5×5 MatrixVectorInt64:
 [1, 1]  [1, 2]  [1, 3]  [1, 4]  [1, 5]
 [2, 1]  [2, 2]  [2, 3]  [2, 4]  [2, 5]
 [3, 1]  [3, 2]  [3, 3]  [3, 4]  [3, 5]
 [4, 1]  [4, 2]  [4, 3]  [4, 4]  [4, 5]
 [5, 1]  [5, 2]  [5, 3]  [5, 4]  [5, 5]

我尝试了什么

我刚刚尝试了以下方法:

X1 = [1,2,3,4,5]
X2 = copy(X1)
Lattice = MatrixVectorInt64(undef, length(X1), length(X2)) # what I want to make
for x1 in X1
    for x2 in X2
        Lattice[x1,x2] = [X1[x1],X2[x2]]
    end
end

Lattice

问题

还有其他方法可以使代码简单或简短吗? 如果增加像 50 x 50 这样的晶格尺寸,我担心性能会变差。还有更好的方法吗? 还有什么更好的做法?

任何信息将不胜感激。

【问题讨论】:

下面有一些不错的答案,其中CartesianIndices 是最快最轻量级的(它不会占用更多内存,不管你的格子有多大。)但是如果你想要针对的答案你的用例,你应该提供更多关于你想用它做什么的细节。 【参考方案1】:

它不是向量矩阵,但 CartesianIndices 可用于此目的。

L = zeros((5,5)) # example 5x5 Matrix

Li = CartesianIndices(size(L))
#=
5×5 CartesianIndices2,TupleBase.OneToInt64,Base.OneToInt64:
 CartesianIndex(1, 1)  …  CartesianIndex(1, 5)
 CartesianIndex(2, 1)     CartesianIndex(2, 5)
 CartesianIndex(3, 1)     CartesianIndex(3, 5)
 CartesianIndex(4, 1)     CartesianIndex(4, 5)
 CartesianIndex(5, 1)     CartesianIndex(5, 5)
=#

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

CItoVector(CI) = collect(Tuple(CI))

CItoVector.(Li)
#=
5×5 ArrayArrayInt64,1,2:
 [1, 1]  [1, 2]  [1, 3]  [1, 4]  [1, 5]
 [2, 1]  [2, 2]  [2, 3]  [2, 4]  [2, 5]
 [3, 1]  [3, 2]  [3, 3]  [3, 4]  [3, 5]
 [4, 1]  [4, 2]  [4, 3]  [4, 4]  [4, 5]
 [5, 1]  [5, 2]  [5, 3]  [5, 4]  [5, 5]
=#

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

【讨论】:

谢谢。我不知道笛卡尔指数。当我遇到这种情况时,我想使用它。【参考方案2】:

您可以使用array comprehension:

julia> N = 5;

julia> L = [[i, j] for i in 1:N, j in 1:N]
5×5 MatrixVectorInt64:
 [1, 1]  [1, 2]  [1, 3]  [1, 4]  [1, 5]
 [2, 1]  [2, 2]  [2, 3]  [2, 4]  [2, 5]
 [3, 1]  [3, 2]  [3, 3]  [3, 4]  [3, 5]
 [4, 1]  [4, 2]  [4, 3]  [4, 4]  [4, 5]
 [5, 1]  [5, 2]  [5, 3]  [5, 4]  [5, 5]

【讨论】:

【参考方案3】:

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

julia> vcat.(1:5, (1:5)')
5×5 MatrixVectorInt64:
 [1, 1]  [1, 2]  [1, 3]  [1, 4]  [1, 5]
 [2, 1]  [2, 2]  [2, 3]  [2, 4]  [2, 5]
 [3, 1]  [3, 2]  [3, 3]  [3, 4]  [3, 5]
 [4, 1]  [4, 2]  [4, 3]  [4, 4]  [4, 5]
 [5, 1]  [5, 2]  [5, 3]  [5, 4]  [5, 5]

【讨论】:

以上是关于在 Julia 中制作二维晶格的主要内容,如果未能解决你的问题,请参考以下文章

微信怎么制作表白二维码

自己怎么制作二维码

二维码生成器加logo怎么制作

二维码是怎么制作出来的?

石墨烯

如何制作二维码之活码?