Синглтонный вектор отличается от его транспонирования в Юлии - PullRequest
3 голосов
/ 07 апреля 2020

Если я определяю A = [1], я получаю, что A не равно A', поскольку они бывают разных типов:

julia> A=[1]
1-element Array{Int64,1}:
 1

julia> A'
1×1 LinearAlgebra.Adjoint{Int64,Array{Int64,1}}:
 1

julia> A == A'
false

Если я определяю другой вектор B = [1, 2, 3] и пытаюсь для продуктов с A' и A я получаю следующий вывод:

B=[1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

julia> B*A'
3×1 Array{Int64,2}:
 1
 2
 3

julia> B*A
ERROR: MethodError: no method matching *(::Array{Int64,1}, ::Array{Int64,1})
...
...

Кажется, проблема в сигнатуре оператора *, которая, кажется, не принимает два Array{Int64,1} в качестве операндов при определении другого вектор C = [4 5] мы получаем:

julia> C=[4 5]
1×2 Array{Int64,2}:
 4  5

julia> B*C
3×2 Array{Int64,2}:
  4   5
  8  10
 12  15

Итак, * определяется для операндов типов Array{Int64,1} и Array{Int64,2} соответственно. Почему я не могу умножить вектор столбца на одноэлементный вектор A, но могу использовать A'?

Ответы [ 2 ]

5 голосов
/ 07 апреля 2020

Ответ на этот вопрос зависит от того, насколько хорошо вы понимаете линейную алгебру. Джулия следует соглашениям линейной алгебры для умножения массива, если вам нужно bru sh up, страница википедии - хороший источник.

Это сводится к тому, что ваш A является вектором столбца, тогда как A' является вектором строки (как C). Умножение матриц определяется между (n, k) и (k, m) матрицами для получения матрицы (n, m). Векторы столбцов иногда можно рассматривать как матрицы (n, 1), поэтому нет четко определенного понятия умножения между двумя векторами столбцов.

Если вы хотите получить точечное произведение, используйте функцию dot (сначала вам нужно будет сделать using LinearAlgebra). Если вы хотите поэлементный продукт, вы можете использовать радиовещательную нотацию u .* v.

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

В Юлии Vector s - одномерные Array s, в то время как транспозиция работает на двухмерных матрицах (Array{T,2}, эквивалентных Matrix{T})

julia> A=[1]
1-element Array{Int64,1}:
 1

julia> collect(A')
1×1 Array{Int64,2}:
 1

Поскольку транспозиция в Юлии не материализует данные и скорее содержит ссылку на оригинал, который мне нужно было использовать collect, чтобы реально увидеть, что происходит.

При использовании умножения на 2-мерные массивы вы фактически используете операции линейной алгебры.

Если вы хотите умножить поэлементно, используйте вместо этого оператор точки .:

julia> A .== A'
1×1 BitArray{2}:
 1

Обратите внимание, что он возвращает Array, а не одно значение.

Если вы хотите умножить поэлементно (вместо использования умножения матрицы линейной алгебры), вам нужно снова векторизовать:

julia> B.*A
3-element Array{Int64,1}:
 1
 2
 3
...