Юлия: Как мы можем вычислить сопряженную или классическую сопряженную (линейную алгебру)? - PullRequest
3 голосов
/ 28 сентября 2019

Я хочу вычислить классическое сопряженное в Julia 1.0

Для этого я скопировал матрицу, приведенную в качестве примера в Википедии

julia> B = [-3 2 -5; -1 0 -2; 3 -4 1]
3×3 Array{Int64,2}:
 -3   2  -5
 -1   0  -2
  3  -4   1

Это, кажется,мне вычислить транспонирование B, а не его сопряженный.Вместо этого мы должны получить это (из wikipedia ):

и попытаться получить его сопряжение, используя функцию adjoint(), которая упоминается в документации Julia здесь несмотря начто в документе конкретно не сказано, что делает эта функция

julia> adjoint(B)
3×3 Adjoint{Int64,Array{Int64,2}}:
 -3  -1   3
  2   0  -4
 -5  -2   1

Вместо этого я хочу получить это:

enter image description here

В MatlabЯ действительно получаю:

>> adjoint(B)

ans =

   -8.0000   18.0000   -4.0000
   -5.0000   12.0000   -1.0000
    4.0000   -6.0000    2.0000

1 Ответ

6 голосов
/ 28 сентября 2019

Сопряженный Юлии определяется как транспонирование комплексного сопряжения входной матрицы.Тем не менее, вы, похоже, хотите, чтобы матрица adjugate :

Адъюгат иногда называли «сопряженным», но сегодня «сопряженный» матрицы обычно ссылается на ее соответствующийоператор присоединения, который является его сопряженным транспонированием.

Вы можете вычислить сопряженную матрицу путем инвертирования, а затем умножения на определитель:

julia> det(B) * inv(B)
3×3 Array{Float64,2}:
 -8.0  18.0  -4.0
 -5.0  12.0  -1.0
  4.0  -6.0   2.0

Благодаря @Antoine Levitt и @Syx Pek на Julia Slack за предложение инвертировать и умножать на определитель.


Первоначальный ответ:

Матрица сопряженных, по-видимому, транспонирует матрицу кофакторов.Ниже приведена наивная реализация поиска кофакторов:

# import Pkg; Pkg.add("InvertedIndices")
using InvertedIndices # for cleaner code, you can remove this if you really want to.
function cofactor(A::AbstractMatrix, T = Float64)
           ax = axes(A)
           out = similar(A, T, ax)
           for col in ax[1]
               for row in ax[2]
                   out[col, row] = (-1)^(col + row) * det(A[Not(col), Not(row)])
               end
           end
           return out
       end

Затем, чтобы найти адъюгат, вам нужно только транспонировать (transpose(cofactor(B))).

Ответ:

julia> cofactor(B, Float64) |> transpose
3×3 Transpose{Float64,Array{Float64,2}}:
 -8.0  18.0  -4.0
 -5.0  12.0  -1.0
  4.0  -6.0   2.0

, что эквивалентно тому, что дает Matlab.

Редактировать: @Antoine Levitt на слабости Джулии указал, что это по существу измененная обратная матрица, так что если вы вычислите коэффициент масштабирования, вы можетепросто сделайте inv(B) * scaling_factor (для этой матрицы это 6).

...