ランダムな低ランクテンソルが欲しいときってありますよね. テンソルのランクっていろいろありますが,とりあえずタッカーランクがひくいランダムテンソルを手に入れるコードをかきました.
もっとよい方法があったら知りたいです.
using LinearAlgebra using TensorToolbox function get_low_tucker_tensor(J,R) G = rand(R...) D = length(J) U = Vector{Matrix{Float64}}(undef,D) for d = 1:D U[d] = rand(J[d],R[d]) end T = ttm(G, [U...], [1:D;]) return T end
ここで J
が欲しいテンソルのサイズで,R
が欲しいタッカーランクです.どちらもベクトルで渡してください.たとえば,タッカーランクが(2,2,2)
の3×4×5のテンソルが欲しい場合は以下のようにします.また,mrank
を使うとタッカーランクが確認できます.
julia > J = [3,4,5]; R=[2,2,2]; julia > Y = get_low_tucker_tensor(J,R); julia > mrank(Y) (2,2,2)