清晨晓叙:matlab中的矩阵拼接

来源:互联网 发布:淘宝朋友代付退款 编辑:程序博客网 时间:2024/05/16 07:59

参考:https://zhidao.baidu.com/question/335503359.html
https://baike.baidu.com/item/repmat/8599219?fr=aladdin

在等待了半个小时之后,终于走进了实验室,娜小笑同学还没来,可是故事已经开始了。
在看别人的梯度下降算法的实现的code的时候,遇到了一些很小的疑问。因为繁琐,所以想把这些记录下来,既为自己做笔记,也为那些后来者。

size函数

首先需要介绍的是size函数,因为其使用简单我就一笔带过,size(x,1)
size(x,2),size(x,3)可分别获取一个矩阵的行数,列数以及通道数。
实验的代码如下,有兴趣的可以加深一下印象。

x =[1 2 3 4;5 6 7 8];% 获取x的行数m = size(x,1);n = size(x,2);z = size(x,3);

从低维矩阵到高维矩阵

当时为了测试size的时候,想找一个3维的矩阵,但是发现居然忘了repmat函数的使用,那就顺便说一下如何利用repmat函数构建3维矩阵。当然在叙述之前,其实我们还是可以用一些笨方法去完成从2维矩阵到3维矩阵的“跳跃”。当然这很繁琐,但是你要先会实现需求,才能去谈优化,不是吗?

实现代码

% 笨方法 x = [1 2 3 4;5 6 7 8];% 开辟一个2*4*3的空间y3d = zeros(2,4,3);% 为每个通道赋值即可y3d(:,:,1) = x;y3d(:,:,2) = x;y3d(:,:,3) = x;% 使用repmatx3d = repmat(x,[1 1 3])

repmat函数

repmat语法:B = repmat(A,m,n) 将矩阵 A 复制 m×n 块,就是将A作为一个整体,重复m行再重复n列。还有种看起来更规范的写法B = repmat(A,[m n])其实与 B = repmat(A,m,n) 的用法一致。
repmat(x,[1 1 n]):可以将x构建成n维的矩阵。但是仔细想一下,似乎“笨方法”也有可取之处呀,假如你要构建的矩阵每一维都要求是不同的,这时候似乎repmat就无能为力了。看起来也不是很笨嘛。

矩阵的拼接

好了,让我们回到主题矩阵拼接上。那假如我有一个x =[1 2;3 4]的矩阵,我想它变成 x_new = [1 1 2;1 3 4]要怎么实现呢?假如是x_new=[1 2;3 4;1 1]呢?先从简单的来说,假如有 x =[1 2]到x = [1 2 3],你一定知道,同理从x =[1;2]到x =[1;2;3]也很简单,这里我要说的是‘,’和‘;’的区别,‘,’是用来标志列的,即它的前后都是一列,而‘;’是用来标志行的,即在它前后都是独立的一行。用代码来示范下。

% 两列 1和2x =[1,2]% 加一列元素为3x_new =[x,3];% 两行 1和2y =[1;2];% 加一行元素为3y_new =[y;3] 

好了理解了上面的行列标志,下面的代码其实也就能看懂了。实现一下上面的2维的拼接。

x =[1 2;3 4];% 实现x_new = [1 1 2;1 3 4]x_new =[ones(size(x,1),1),x];% 实现x_new=[1 2;3 4;1 1]x_new2 = [x;ones(size(x,2),1)'];

就写到这里吧,又快到中午了,看代码。

原创粉丝点击