У Юлии Транспонент - PullRequest
2 голосов
/ 11 апреля 2020

Я пытаюсь использовать оператор транспонирования над вектором, чтобы выполнить поэлементное сложение. Например, я хочу добавить вектор-столбец a = [a1;a2;a3] к вектору-строке b = [b1,b2] Я должен получить матрицу M = a+b = [a1+b1, a1+b2; a2+b1, a2+b2; a3+b1, a3+b2]. В MATLAB это эквивалентно (если оба вектора являются векторными строками) M = a.'+b

Я пытаюсь получить то же самое в Юлии, но вот проблема, в Юлии нет оператора .', начиная с версии 1.0 , Есть оператор транспонирования, который не работает в режиме вещания. Оператор присоединения для меня недопустим, потому что я работаю с комплексными числами.

a = Vector{ComplexF64}([1+3im,2])
b = Vector{ComplexF64}([0,0,0])
Z = zeros(ComplexF64,3,2)
G = zeros(ComplexF64,3,2)


@. Z = b + a'           # Works but takes the complex conjugate
@. Z = b + transpose(a) # DOES NOT WORK!!!! The error is " DimensionMismatch("array could not be broadcast to match destination") "
Z = b .+ transpose(a)   # Works but not efficient
@. Z = b + conj(a')  

Третий случай Z = b .+ transpose(a) неэффективен, потому что он делает два цикла первым для сложения b .+ transpose(a), чем он запускает второй l oop один для присвоения b .+ transpose(a) Z. В то время как другие 3 случая делают это в течение одного l oop. Так какой же самый быстрый способ? И почему транспонирование не в трансляции?

Заранее спасибо

1 Ответ

2 голосов
/ 11 апреля 2020

Вы можете просто набрать:

a' .+ b

Пример

julia> a = ComplexF64.([1+3im,2])
2-element Array{Complex{Float64},1}:
 1.0 + 3.0im
 2.0 + 0.0im

julia> b = ComplexF64.([10,20,30])
3-element Array{Complex{Float64},1}:
 10.0 + 0.0im
 20.0 + 0.0im
 30.0 + 0.0im

julia> a' .+ b
3×2 Array{Complex{Float64},2}:
 11.0-3.0im  12.0+0.0im
 21.0-3.0im  22.0+0.0im
 31.0-3.0im  32.0+0.0im

Я понимаю, что вы обеспокоены тем, что здесь снижается производительность. Однако в Юлии, в отличие от Matlab, transpose не материализует данные. Он просто предоставляет вам различную индексацию ссылки на данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...