首发于 MATLAB迷踪

matlab-多维数组的拼接和提取:向量、矩阵、多维数组

拼接多维数组

matlab中的多维数组在不太严格的意义下与数学中的向量、矩阵和张量一一对应。

向量、矩阵又可以称为一阶张量、二阶张量,因此可以说多维数组对应张量。

用比较容易理解的三阶张量来解释多维数组的维度,维度一就是通常意义上的行,维度二就是列,维度三就是page,如下图。

1,拼接两个向量

行向量和列向量都是一样的情况,就只写行向量了。

a = [1,2,3];
b = [4,5,6];
c1 = [a;b]
c2 = [a,b]

结果如下

c1 =
     1     2     3
     4     5     6
     1     2     3     4     5     6

2,拼接两个矩阵

A = [1,2,3;1,2,3];
B = [4,5,6;4,5,6];
C1 = [A;B] 
C2 = [A,B]

结果如下

C1 =
     1     2     3
     1     2     3
     4     5     6
     4     5     6
     1     2     3     4     5     6
     1     2     3     4     5     6

我们发现,向量和矩阵的拼接方是比较相似,可以总结一下,拼接的维度可以不同,但剩余的维度一定要相同

上述向量和矩阵的拼接方式可以用cat函数 [1] 完成

cat(1,a,b)%[a,b]
cat(2,a,b)%[a;b]
cat(1,A,B)%[A,B]
cat(2,A,B)%[A;B]

C = cat(dim,A,B),

A B 具有兼容的大小(除运算维度 dim 以外的维度长度匹配)时, C = cat( dim , A , B ) 沿维度 dim B 串联到 A 的末尾。

cat函数的第一个参数就是指的多维数组的维度,剩余的两个参数分别待拼接矩阵A,B

3,拼接三阶张量

三阶张量的情况不太一样,这是因为三维数组在matlab中并不能如同向量和矩阵一样显示给出,而是采取了一种迂回的方式 [2] ,创建N维数组总是需要先创N-1维的数组(个人理解,实际中不太常用)。

% 拼接多维数组
AT(:,:,1) = A;
AT(:,:,2) = A;
BT(:,:,1) = B;
BT(:,:,2) = B;
size(AT)%the size of AT
size(BT)%the size of BT
CT1 = cat(1,A,B)%注意维度兼容
CT2 = cat(2,A,B)
CT3 = cat(3,A,B)

这样就可以很方便的处理matlab中的数据了

从多维数组中提取向量和张量

从向量中提取向量

太简单了

从矩阵中提取向量和矩阵

太简单了

从多维数组中提取向量和矩阵

还是以容易理解的三阶张量为例,矩阵中固定列按行可取出列向量,固定行按列可取出行向量,那么在三阶张量中,固定列和page,按行可取出row tube,同理,固定行和page,按列可取出 column tube,固定行和列,按page可取出page tube。不同于矩阵中反人类的记号,我们在张量中把这样固定其余维度不变只变动一个维度得到的向量称为tube。

row_tube = AT(:,1,1)
column_tube = AT(1,:,1)
page_tube = AT(1,1,:)

结果如下

row_tube =
column_tube =
     1     2     3