Hallo,
Do you know ‘good’ ways to refactor a symmetric matrix into a vector, and back again?
Ideally, something like this:
A = [1 2 3; 2 4 5; 3 5 6]
V = mat2vec(A) # V = [1 2 3 4 5 6]
A = vec2mat(V) # A = [1 2 3; 2 4 5; 3 5 6]
Many thanks,
Hallo,
Do you know ‘good’ ways to refactor a symmetric matrix into a vector, and back again?
Ideally, something like this:
A = [1 2 3; 2 4 5; 3 5 6]
V = mat2vec(A) # V = [1 2 3 4 5 6]
A = vec2mat(V) # A = [1 2 3; 2 4 5; 3 5 6]
Many thanks,
See
Maybe it’s not a “good” way in the sense you expect, but in some cases it could work
julia> function symmat2vec(m)
n=size(m,1)
N=n*(n+1)÷2
v=Vector{eltype(m)}(undef,N)
for idx in 1: N
j = Int(ceil(sqrt(2 * idx + 0.25) - 0.5))
i = Int(idx - (j-1) * (j) / 2)
v[idx] = m[i, j]
end
v
end
symmat2vec (generic function with 1 method)
julia> function vec2symat(v)
N=size(v,1)[1]
n=Int((-1+ sqrt(1+8*N))/2)
m=Matrix{eltype(v)}(undef,n,n)
rngs=[Int(n*(n-1)/2+1):Int(n*(n+1)/2) for n in 1:4]
for c in 1:4
r=4*(c-1)+1:4*(c-1)+4
m[r]= v[[rngs[c];getindex.(rngs[c+1:end],c)]]
end
m
end
vec2symat (generic function with 1 method)
julia> m=[ 11 2 13 4; 2 3 4 25; 13 4 5 6; 4 25 6 77]
4×4 Matrix{Int64}:
11 2 13 4
2 3 4 25
13 4 5 6
4 25 6 77
julia> v=symmat2vec(m)
10-element Vector{Int64}:
11
2
3
13
4
5
4
25
6
77
julia> vec2symat(v)
4×4 Matrix{Int64}:
11 2 13 4
2 3 4 25
13 4 5 6
4 25 6 77