matlab数组操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a19990412/article/details/78259176

有很多种方法,这里就列举几种,要是各位有什么想要补充,可以留在评论区。
一、生成:
1.直接用方括号写

a = [1,2,3,4,5];
disp(a);

2.用:生成

a = 1:5;
disp(a);

第二个版本(等差数列)

a = 1:2:10;
disp(a);

3.linspace(a,b,n);[a,b] n-1等分,用那个等分点构成这个序列
(一般用于画图)

a = linspace(1,10,3);
disp(a);

4.zeros函数

a = zeros(1,10);
disp(a);

5.eye函数(这个生成的是对角阵,要是不够对角阵,就取这个对角阵的左上角)

a = eye(1,10);
disp(a);

6.ones函数

a = ones(1,10);
disp(a);

7.矩阵拼接生成

a = ones(1,10);
b = zeros(1,10);
disp([a,b]); % 同行拼接
a = ones(1,10);
b = zeros(1,10);
disp([a;b]); % 列拼接

8.空数组

a = []; % 这样就完成了生成

要理解空数组的存在的意义需要一定的计算机的功底,如果没兴趣可以不用去了解的。
不过,我们还是进入我们的应用层面的思考:
我写过篇关于Python中的None等的TrueFalse问题的探讨文章
点击这个可以查看
因此,我对这个做了类似的处理

a = [];
if a
    disp('True');
else
    disp('False');
end

输出的是False
情况是类似的

二、删除行列
[]还有一个应用就是删除矩阵的部分

a = [1,2,3;4,5,6;7,8,9];
a([1,3],:) = [];
disp(a);

这样就删除了第1,3行(要注意的是,matlab这里比较符合数学人的思维,不像计算机的从0计数)
类似的,删除1,2列

a = [1,2,3;4,5,6;7,8,9];
a(:,[1,2]) = [];
disp(a);

三、提取和展示
提取行

a = [1,2,3;4,5,6;7,8,9];
disp(a(1,:));
a = [1,2,3;4,5,6;7,8,9];
disp(a([1,3],:));

提取列(原理类似)

a = [1,2,3;4,5,6;7,8,9];
disp(a(:,[1,3]));
a = [1,2,3;4,5,6;7,8,9];
disp(a(:,1));

有趣的事

a = [1,2,3;4,5,6;7,8,9];
disp(a(1));

我一开始不太理解这样的操作,我一看,这样的结果居然不是第一行。
很不理解,于是,我开始了探索
我先是很好奇,那我输入4呢?

a = [1,2,3;4,5,6;7,8,9];
disp(a(4));

结果是2
我就在想,是不是会有一个返还的机制,就是走到越界之后,就再往回走一遍。然后我就做了下面的操作。看看是不是也是2

a = [1,2,3;4,5,6;7,8,9];
disp(a(2));

结果是
4
这时候,灵机一动,我想起了矩阵有一个很骚的操作

a = [1,2,3;4,5,6;7,8,9];
disp(a(:));

这样就是将a按列展开
输出结果是
1
4
7
2
5
8
3
6
9
这样看来,就很好理解了
在MATLAB内部,在矩阵上,对于单独的数采用类似操作方法

为了验证我的观点,我做了最好玩的一个实验

a = [1,2,3;4,5,6;7,8,9];
disp(a(10));

这个代码是会报错的
然后输出的错误是
‘索引超出矩阵维度。’
证明了之前的观点。(本人懒得看文档了)
//======回到之前的做那个提取
还有就是提取子串(,子矩阵)

a = [1,2,3;4,5,6;7,8,9];
disp(a([1,3],[1,2]));

这样就是拿对应列和对应行的方法。
要是想要拿部分列呢?比如对应的,我要拿一个规模大于10 * 10 的前10行怎么搞?
哈哈哈,是不是就有人懵了?
其实很有趣
注意到,这种提取的是用了数组的生成的对应项的
所以,我们可以用到前面的数组生成的部分方法做
如:

a = [1,2,3;4,5,6;7,8,9];
disp(a([1:3],[1,2]));

连续的三行,和第1,2列,这样看不出来什么,但是要是规模大的时候呢?比如说是100*100的中间50行和50列组合成的东西呢?
(别告诉我,用不到emm)

a = rand(100,100);
disp(a([25:75],[25:75]));

这样就可以做到了
对了,如果你说这个是会生成51*51也对,毕竟是包括了首末的。
所以,可以根据自己的需求,进行筛选。
生成三角阵

a = rand(3,3);
disp('a = ');
disp(a);
disp('diag(a) = '); % 生成对角元素,作为列
disp(diag(a));
disp('tril(a) = '); % 生成上三角阵
disp(tril(a));
disp('triu(a) = '); % 生成下三角阵
disp(triu(a));

可能有些时候,由于版本不同,显示的情况有点不一样。但大致上是一致的。

猜你喜欢

转载自blog.csdn.net/a19990412/article/details/78259176