#julia
#julia
Вопрос:
В Julia можно найти conj
и conj!
для соответственно неуместного и сопряженного на месте объекта сложного типа. Удивительно, но я не смог найти версию на месте для противоположного (аддитивного обратного) массива.
Основной интерес связан с распределением, поскольку версия на месте ничего не выделяет.
Вот некоторые сравнительные тесты.
# using BenchmarkTools
a = rand(ComplexF64,1000,1000);
@btime conj($a);
@btime conj!($a);
@btime -$a;
@btime -1 .* $a;
@btime flipsign.(a,-1);
@btime .-$a;
julia> using BenchmarkTools
julia> a = rand(ComplexF64,1000,1000);
julia> @btime conj($a);
3.594 ms (2 allocations: 15.26 MiB)
julia> @btime conj!($a);
979.401 μs (0 allocations: 0 bytes)
julia> @btime -$a;
3.594 ms (2 allocations: 15.26 MiB)
julia> @btime -1 .* $a;
3.586 ms (2 allocations: 15.26 MiB)
julia> @btime flipsign.(a,-1);
3.588 ms (4 allocations: 15.26 MiB)
julia> @btime .-$a;
3.588 ms (2 allocations: 15.26 MiB)
Комментарии:
1. Можете ли вы уточнить, что вы подразумеваете под «противоположностью массива»? Я не совсем понимаю, о чем вы спрашиваете.
2. @DNF Я бы предположил, что противоположность массива — это массив противоположности каждого термина. Это кажется довольно простым, но, может быть, это не так?
3. Что вы подразумеваете под «противоположностью»? Похоже, вы имеете в виду что-то другое, возможно, «негативное»?
4. Это не то, что означает «противоположное», отсюда и недоразумение. Теперь я понимаю, вы имели в виду «отрицательный», а не «противоположный», и я вижу, что на ваш вопрос был дан ответ. Но я предлагаю вам отредактировать свой вопрос, чтобы заменить «противоположный» на «отрицательный», потому что сейчас это очень запутанно.
5. Противоположностью отрицательного числа является положительное число, противоположностью четного числа является нечетное число, а противоположностью большого числа является малое число. Но «противоположность числу» не имеет смысла. Отрицательное значение отрицательного является положительным (минус, умноженный на минус, равен плюс). Я говорю, что ваш вопрос сбивает с толку и предлагает лучшую формулировку.
Ответ №1:
Во всех случаях, кроме того conj!
, в котором вы также измеряете распределение результата выражения. Это исчезнет, если вы используете широковещательное назначение:
julia> @btime(@. $a = conj($a))
2.409 ms (0 allocations: 0 bytes)
julia> @btime(@. $a = -($a));
2.386 ms (0 allocations: 0 bytes)
@.
Макрос — это просто ярлык для «везде ставить точки», как в a .= .-(a)
.
Возможно, ваша путаница возникает из-за неправильного представления о типах Julia. В отличие от (я полагаю) в Matlab, скаляры и массивы строго различаются. conj
работает со сложными скалярами, в то время conj!
как является просто помощником для массивов комплексных чисел, эквивалентных a -> a .= conj.(a)
. Операции на месте, естественно, могут работать только с массивами (т. Е. Ссылочными типами), а не со скалярами.
Комментарии:
1. Так вы имеете в виду, что выполнение, например
a = -a
, не приводит к дополнительному распределению? Или более вероятноa .= -a
?2. Оба они выполняют дополнительные выделения. Либо делай
a .= .-a
, либо@. a = -a
3. @BambOo
broadcast!(-, a, a)
не выделяет. Остальное — это просто синтаксис для этого; любой из вариантов, показанных DNS, работает и становится тем же (или, по крайней мере, эквивалентным) широковещательным вызовом.