matlab中tensor_toolbox的用法
本篇博客是根据MATLAB tensor classes for fast algorithm prototyping和efficient matlab computations with sparse and factored tensors 两篇论文整理而成,为了方便,截取了原论文中的大量内容作为插入图片。本博客使用的matlab工具箱为tensor_toolbox。该博客的内容仅供自己和大家学习tensor的matlab的基本操作为主,不涉及商业使用,严禁用于商业用途。转载请注明出处。
张量(tensor)指的是多维或n-array数组,开发tensor工具箱考虑的是特殊结构的张量如何允许高效存储和计算。 首先考虑稀疏张量, 并描述了该格式下的各种数学运算的计算效率包括典型的张量分解算法。其次,我们研究了因子化张量(factored tensor), 这类张量具有更基础的分量的性质。 主要包括两类: Tucker tensor 和Kruskal tensor(rank-1 tensors的和)。
1. 数组与张量的相互转化
a = rand([3,4,5]);
T = tensor(a); % 将数组转化为tensor
A = double(T); % 将tensor转化为array
2. 返回tensor的阶数(mode的个数)
matlab 命令 whos 并不能正确报告scalar(order-0)或者向量(order-1)的阶数
ndims(T)
3. 对张量进行索引和矩阵的形式是一样的
T(1,2,2:3)
4. tensor 的一般运算
5. n-mode 张量乘以矩阵
x = tensor(rand([3,4,5]));
C1 = rand(3);
C2 = rand(4);
C3 = rand(5);
y = ttm(x,{C1,C2,C3},1:3);
注意: 这里的x必须是一个张量, { C 1 , C 2 , C 3 } \{C_1,C_2,C_3\} {C1,C2,C3}是一个cell格式的矩阵列表,1:3表示张量x需要做乘法的mode。
6. 张量乘以向量
x = tensor(rand([3,4,5]));
C1 = rand(3);
C2 = rand(4);
C3 = rand(5,1);
y = ttm(x,{C1,C2},1:2);
y = ttv(y,C3,3);
注意:当需要乘的东西是一个向量时,必须用ttv命令,其用法与ttm一致。
7. 张量 乘以 张量
我们考虑张量-张量乘法的三种一般情况:外积(outer product)、缩约积(contracted product)和内积(inner product)。
7.1 外积(outer product)
a = tensor(rand([3,4]));
b = tensor(ones(5,1));
T = ttt(a,b);
7.2 缩约积(contracted product)
两个张量的缩合积是前两小节所讨论的张量-向量和张量-矩阵乘法的推广。
7.3 内积(inner product)
8. 将tensor转化为matrix
把张量的元素重新排列成一个矩阵是很有用的。虽然这个过程有很多名字,我们把它称为“矩阵化(matricizing)”,因为张量的矩阵化类似于矩阵的向量化。也将这个过程称为“展开(unfolding)”。它有时也被称为“扁平化(flattening)”。
t1 = tenmat(T,1);
t2 = double(t1);
t1.tsize
t1.rindices
t1.cindices