gpt4 book ai didi

Julia 中的元编程——将整数拼接成变量名

转载 作者:行者123 更新时间:2023-12-03 23:35:45 24 4
gpt4 key购买 nike

简短问题:

我有一个整数变量 N,我想编写一个宏来生成一个虚拟变量 i_($N)

一次尝试:

@generated function testfunc(N)
:(i_($N))
end
testfunc(5) # Desired behavior i_5

ERROR: UndefVarError: i_ not defined
in testfunc at none:2

更长的解释:

我最近发现了Base.Cartesian在 Julia 。它有一些方便的技巧来生成用于索引多维数组的虚拟变量。

Cartesian 中的@ntuple 宏可以生成从 1 开始的序列。例如,@ntuple 5 k->i_k 生成 (i_1,i_2,i_3 ,i_4,i_5)。在@generated 函数中,如果 W=5 那么 @ntuple ($W) k->i_k 将产生相同的序列。这不起作用:@ntuple 1 k->i_(k+$W)

我想不出一种方法来生产,例如i_3 如果N=3(这可能在@generated 函数内)。

我的最终目标是在笛卡尔坐标系中使用 @nloops 循环一系列虚拟变量,并将结果存储在由其中一个虚拟变量索引的某个存储向量中,例如像这样的东西:

@nloops ($W) i A begin
# Example generated code for N=2, W=3:
# storage[i_2] *= A[i_1, i_2, i_3]
storage[i_($N)] *= A[(@ntuple ($W) k->i_k)...]
end

最佳答案

我还没有明白你到底想要什么,但是有一些注意事项:

  1. @generated 参数是宏主体中的类型。例如。在 @generated function testfunc(N) 中,N 类似于 Int64 而不是 3

  2. 如果你想连接一个变量名,你可能需要通过 Symbol 或其他东西来构造它,而不仅仅是引用。

例如。

macro testfunc(N)
Symbol("i_$N")
end

@testfunc(2) # equivalent to i_2

关于Julia 中的元编程——将整数拼接成变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36659661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com