Как можно иметь функцию переменной в Юлии? - PullRequest
1 голос
/ 07 мая 2019

если вы не возражаете, не могли бы вы помочь мне, как я могу иметь функцию х следующим образом:

эта функция вычисляет два значения для х

function MOP2(x)
    n=length(x);
    z1=1-exp(sum((x-1/sqrt(n)).^2));
    z2=1-exp(sum((x+1/sqrt(n)).^2));
    z=[z1;z2];
    return z
end

вОсновной код Я хочу иметь

costfunc=F(x)

, но я не знаю, существует он в Юлии или нет.в Matlab это может быть следующим:

costfunc=@(x)  MOP2(x)

есть ли какая-нибудь функция, как @ в Юлии?

Большое спасибо.

1 Ответ

3 голосов
/ 07 мая 2019

Да, для этого есть синтаксис.

Это так называемые анонимные функции (хотя вы можете назначить им имя).

Вот несколько способов сделать это.

x -> x^2 + 3x + 9
x -> MOP2(x) # this actually is redundant. Please see the note below

# you can assign anonymous functions a name
costFunc = x -> MOP2(x)


# for multiple arguments
(x, y) -> MOP2(x) + y^2

# for no argument
() -> 99.9

# another syntax
function (x)
    MOP2(x)
end

Вот несколько примеров использования.

julia> map(x -> x^2 + 3x + 1, [1, 4, 7, 4])
4-element Array{Int64,1}:
  5
 29
 71
 29


julia> map(function (x) x^2 + 3x + 1 end, [1, 4, 7, 4]) 
4-element Array{Int64,1}:
  5
 29
 71
 29

Обратите внимание, что вам не нужно создавать анонимную функцию, такую ​​как x -> MOP2(x). Если функция принимает другую функцию, вы можете просто передать MOP2 вместо передачи x -> MOP2(x). Вот пример с round.

julia> A = rand(5, 5);
julia> map(x -> round(x), A)
5×5 Array{Float64,2}:
 0.0  1.0  1.0  0.0  0.0
 0.0  1.0  0.0  0.0  1.0
 0.0  0.0  1.0  0.0  1.0
 1.0  1.0  1.0  1.0  0.0
 0.0  0.0  1.0  1.0  1.0

julia> map(round, rand(5, 5))
5×5 Array{Float64,2}:
 0.0  1.0  1.0  0.0  0.0
 0.0  1.0  0.0  0.0  1.0
 0.0  0.0  1.0  0.0  1.0
 1.0  1.0  1.0  1.0  0.0
 0.0  0.0  1.0  1.0  1.0

Существует также синтаксис do при передаче функций в качестве аргументов.

Если вы хотите дать имя своей анонимной функции, вы можете также определить другую функцию, такую ​​как

costFunc(x) = MOP2(x) + sum(x.^2) + 4

и используйте costFunc позже.

Если вы хотите вызвать функцию с другим именем, вы можете написать

costFunc = MOP2

если оно внутри функции. Иначе. в глобальном масштабе лучше добавить const перед оператором присваивания.

const constFunc = MOP2

Это важно из соображений стабильности типов.

...