使用符号变量创建任意数组

时间:2017-01-19 18:13:09

标签: julia

是否有内置函数来创建带有符号变量的数组 任意维度?

例如,要创建N ^ 2个符号变量来填充相应的矩阵:

[x11, x12,   ,x1N
 ..., ...,   ,..
 XN1, xN2,   ,xNN]

2 个答案:

答案 0 :(得分:2)

您只需创建符号变量数组。 Array{T,N}。朱莉娅的参数化打字处理它。

示例:SymEngine.jl

您可以设置Matrix{SymEngine.Basic}SymEngine.Basic是其符号表达式所在的类型)。 Julia的通用调度使inv之类的工作成为可能。

编辑:

重新阅读我认为可能会有更多回答这个问题?如果你的意思是符号变量la SymEngine.jl / SymPy.jl,那么你可以通过插入字符串来创建不同的变量:

symbols("x$i")

然后答案的第一部分成立:只使用为此类型键入的Julia数组。

arr[i,j] = symbols("x$i$j")

很难从这个问题中知道这是你正在寻找的东西还是别的东西。

答案 1 :(得分:0)

我对短语"符号变量"有点不清楚。因为朱莉娅有一个specific符号type

如果变量是指向某个值的指针,那么您的问题可能是创建数组,其中每个元素也是指向某个值的指针 - 这将是变量数组

在Julia中,您可以创建一个数组,其中每个元素都是指向变量的指针(指向值的指针)。这将是一个符号数组。 (如果我对此的看法是错误的,请有人纠正我。)

创建符号数组没有单一功能,但对于您的示例(单前缀,方阵),它非常简单。

  1. 创建字符串前缀数组
  2. 创建字符串元素索引数组
  3. 连接前缀和索引
  4. 将字符串转换为符号
  5. function SymArray(N)  
        A = Array{Symbol}(N,N)       # initialize output array  
        prefixes = fill("x", (N,N))  # create array of prefixes  
        rix = collect(1:N)           # create column of numeric row indices  
    
        for i in collect(1:N)
            tmpCol = string.(rix, i) # add column indices; 'dot' applies string() to each element
            A[:,i] = tmpCol          # add fully indexed column to output array
        end
    
        A = Symbol.(prefixes, A)     # concatenate & convert strings to symbols
    
        return(A)
    end
    
    julia> S = SymArray(3)
    3×3 Array{Symbol,2}:
     :x11  :x12  :x13
     :x21  :x22  :x23
     :x31  :x32  :x33
    
    julia> S[1,1]
    :x11
    

    但是,我们还没有定义x11,所以它并没有指向任何东西。

    julia> eval(S[1,1])
    ERROR: UndefVarError: x11 not defined
     in eval(::Module, ::Any) at ./boot.jl:234
     in eval(::Any) at ./boot.jl:233
    

    每次将值存储到命名变量中时,都可以从符号数组中访问该值。

    julia> x11 = 1.2
    1.2
    
    julia> eval( S[1,1] )
    1.2
    
    julia> 3*eval(S[1])
    3.6
    

    这可能是创建查找表的一种有趣方式。