На месте напротив (аддитивная инверсия) массива

#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, работает и становится тем же (или, по крайней мере, эквивалентным) широковещательным вызовом.