2017-01-19 2 views
0

Есть ли встроенная функция для создания массивов с символическими переменными произвольного измерения?Создать произвольные массивы с символическими переменными

Например, чтобы создать N^2 символьные переменные, чтобы заполнить соответствующую матрицу:

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

Если любой из этих ответов разрешил вашу проблему, вы должны принять один из них. –

ответ

2

Вы просто создать массив символьных переменных. Array{T,N}. Параметрическая типизация Юлии справляется с этим.

Пример: SymEngine.jl

Вы можете сделать Matrix{SymEngine.Basic} (SymEngine.Basic тип, который его символические выражения в). Общие рассылки Джулии делают такие вещи, как inv.

Edit:

Re-чтение Я думаю, что может быть немного больше, чтобы ответить на этот вопрос? Если вы имеете в виду символические переменные а-ля SymEngine.jl/SymPy.jl, то вы можете создавать различные из них с помощью интерполирования в строку:

symbols("x$i") 

Тогда первая часть ответа имеет: просто использовать массив Джулии, которая напечатан для этого типа.

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

Трудно узнать из вопроса, является ли это то, что вы ищете или что-то еще.

+0

Поддерживает ли эта операция? Например, сделайте матричное умножение с одной матрицей символов и другой матрицей, заполненной реалами? – user2820579

+0

Кроме того, у меня возникают проблемы с установкой этого пакета. – user2820579

+0

Да, он просто использует систему отправки и продвижения Юлии. Матричное умножение вызывает возврат к общей функции, которая будет работать в любом случае, когда типы элементов имеют '*' и '+'. –

0

Я немного неясен в отношении фразы «символические переменные», поскольку у Юлии есть символ specifictype.

Если переменная указана на значение, тогда ваш вопрос может заключаться в создании массивов, в которых каждый элемент также является указателем на какое-либо значение - это будет массив переменных .

В Julia вы можете создать массив, в котором каждый элемент является указателем на переменную (указатель на указатель на значение). Это будет массив символов. (Если мое мнение об этом неверно, кто-то, пожалуйста, поправьте меня.)

Существует не одна функция для создания массива символов, но для вашего примера (одиночный префикс, квадратная матрица) это довольно просто.

  1. Создать массив строки префиксы
  2. Создать массив индексов элементов строки
  3. Concatenate префикс и индексы
  4. преобразования строк символов

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 

Это может быть интересный способ для создания таблицы поиска.

Смежные вопросы