On Julia Version 1.0.2 the output of the following code
using LinearAlgebra
unblock(A) = mapreduce(identity, hcat, [mapreduce(identity, vcat, A[:,i]) for i = 1:size(A,2)])
x=Vector{Any}(undef,2)
x[1]=[1+2im 1-im;-3 4+3im]
x[2]=[1+im 0;1 1+im]
y=unblock(x)
println(x)
println(y)
println(adjoint(y)*y)
println(transpose(conj(x))*x)
println(adjoint(x)==transpose(conj(x)))
println(adjoint(x)*x)
is
Any[Complex{Int64}[1+2im 1-1im; -3+0im 4+3im], Complex{Int64}[1+1im 0+0im; 1+0im 1+1im]]
Complex{Int64}[1+2im 1-1im; -3+0im 4+3im; 1+1im 0+0im; 1+0im 1+1im]
Complex{Int64}[17+0im -12-11im; -12+11im 29+0im]
Complex{Int64}[17+0im -12-11im; -12+11im 29+0im]
true
46 + 0im
The correct result is the one obtained by line 9 using the unblocked array y.
The same result is obtained by line 10 using blocked array x.
Although by definition and in Julia adjoint equals conjugate transpose, the result of the last line is scalar.
Multiplication by adjoint works fine is all elements of x are scalars. Could it work correctly in the blocked case, too?
See https://github.com/JuliaLang/julia/pull/27401 for the change and a discussion of this change. The aim was to make dot return a scalar. However, I agree that this is unfortunate would have preferred that the result was a matrix. An example that really makes the issue with the current solution clear is
julia> x
2-element Array{Any,1}:
Complex{Int64}[1 + 2im 1 - 1im; -3 + 0im 4 + 3im]
Complex{Int64}[1 + 1im 0 + 0im; 1 + 0im 1 + 1im]
julia> xm = reshape(x, 2, 1)
2×1 Array{Any,2}:
Complex{Int64}[1 + 2im 1 - 1im; -3 + 0im 4 + 3im]
Complex{Int64}[1 + 1im 0 + 0im; 1 + 0im 1 + 1im]
julia> x'x
46 + 0im
julia> (xm'xm)[1]
2×2 Array{Complex{Int64},2}:
17+0im -12-11im
-12+11im 29+0im
so for array elements, we treat vectors and one-column matrices completely different.
A usecase I’m sad isn’t possible is to store a matrix as a vector of rowvectors.
julia> X1 = randn(3,2);
julia> X2 = [X1[i,:]' for i in 1:size(X1, 1)];
julia> X3 = reshape(X2, length(X2), 1);
julia> X1'X1
2×2 Array{Float64,2}:
2.58747 0.733045
0.733045 0.420716
julia> X2'X2
3.0081843634412744
julia> (X3'X3)[1]
2×2 Array{Float64,2}:
2.58747 0.733045
0.733045 0.420716
(this would be really useful for SVector elememts.)