Предположим, у меня есть кусочная функция foo (x), которая равна x, если x <= 0, и log (x), если x> 0. Эта функция принимает вектор в качестве аргумента. Итак, я попробовал следующее:
function foo(x)
(x .<= 0) .* x + (x .> 0) .* log(x)
end
Очевидно, что это не работает, когда x <0, поскольку он пытается оценить все (даже если это будет умножено на 0. Есть ли лучший способ сделать это?
Спасибо!
Думаю, это то, что вы могли бы попробовать:
foo(x) = x > 0 ? log(x) : x
что предполагает, что x
является скаляром.
Затем, если v
является вектором, когда вы его используете, просто транслируйте его как этот foo.(v)
.
На какой версии Юлии ты? В текущем выпуске Julia этот код не запускается. Я думаю, вам не хватает некоторых точек в вашем коде (до оператора сравнения и после log
). Я сравнил его с предложенным мной foo.(v)
, и он кажется в два раза медленнее в текущем выпуске Julia.
Извините, да, там должны быть точки. При тщательном осмотре показывается, что широковещательная передача дает стабильную производительность (0,06 секунды), в то время как моя версия может быть от 0,05 до 0,2 секунды. Большое спасибо!
Спасибо! Я где-то читал, что Джулия оптимизирует материал, поэтому трансляция занимает не так много времени, как векторизация функции. Пробовал то, что вы предлагали, с моей функцией (отличной от этой), и векторизация выполняется в 5 раз быстрее. Закончил делать:
tmp[x <= 0] = x[x <= 0]; tmp[x > 0] = log(x[x > 0])
.