![c95c134986cd08bdc788dea3dfbda044.png](https://img-blog.csdnimg.cn/img_convert/c95c134986cd08bdc788dea3dfbda044.png)
个人理解matlab是以工具为主,为了解决数学问题/作图而存在的辅助工具,我们只需要针对一系列问题思考需要调用的知识然后doc/help调用文档学习,通过逐步积累最后通透相关数学问题、学会对各种常见图形进行绘制即可。
于是关于matlab的知识我的想法就是把每一道题需要用到的知识挖深掌握,然后其他基础普及就由认真负责的yym老师教啦。
今日简单题:1.创建一个五阶幻方矩阵A
(1)验证A的各列元素之和、各行元素之和、主对角元素之和以及副对角元素之和。
(2)引用A的第二、三列(不用赋给另一个矩阵直接回车)
- 在阅读题目时需要调用的知识:
a.如何创建一个矩阵。b.如何创建一个幻方矩阵。c.如何把幻方矩阵赋值给A。d.如何对A的各列、各行、对角线元素、副对角线元素进行引用以及求和。e.如何对矩阵特定的行、列进行引用。
- 事先需要了解和准备的:matlab2016b(各个版本针对初学阶段其实都差不多)、工作区、编辑器、线性代数基础-矩阵、向量、幻方矩阵的定义、matlab中%符号代表注释。
(1)
- 创建幻方矩阵的方式:magic函数
- 基本语法:magic(n)%n是一个被定义的变量,需要有一个值,我们需要知道在脚本文件和编辑器中是不可以输入和输出变量的,需要在函数文件中才可以输入和输出变量。并且在脚本区创建的变量都是全局变量,而函数文件中的变量是局部变量。
于是我们创建一个五阶幻方矩阵并把它赋值给A:
>>
可以得到这个六阶幻方矩阵(值得吐槽的是它生成的幻方矩阵是固定的2333但是我们知道幻方矩阵的生成方式其实蛮好玩的,也有很多花样。比如:我们先给定一个n阶幻方,由任意一个位置填入1,然后往它的右上方填入2,再往右上方填3,假如右上方遇到了边界,那么就突破边界在最后一行相对上一次填入的数字的右一格中填入相应递增数字,如果右上方已经填有数字的话,那么改为填入上一次填入的数字的下方一格中,突破边界则同理填到最上一行相同列中,最终数字一定会填满整个n阶矩阵。我们看到matlab生成幻方的方式也是这种最常见的方式。跑题了跑题了)
2.计算矩阵中行和列和的方式:sum函数
- 基本语法:sum(A)、sum(A,dim)%如果A是一个行向量,那么sum(A)返回一个数值:A的所有元素的和;如果A是一个矩阵,那么sum(A)返回一个行向量:这个行向量的各元素是A的列和。而sum(A,dim),dim代表维度,通常为1或2,(为3及以上就是更多维度的数组的某一维度求和了,我们暂时用不到故不做记录),如果dim=1,且A为一个矩阵,那么sum(A,1)和sum(A)是等价的;如果dim=2,且A为一个矩阵,那么sum(A,2)的返回值是一个列向量:这个列向量的各元素是A的行和。
于是我们对幻方矩阵求和:
>> sum(A)%生成列和租组成的行向量
ans =%在我们不指定赋值直接计算时,默认赋给ans
65 65 65 65 65
>> sum(A,2)%生成行和组成的列向量
ans =
65
65
65
65
65
3.对角线元素相关的矩阵:diag(A)、fliplr(A)
diag函数%基本语法:diag(A),diag(A,k)
- diag(A)%其中若A为一向量,那么diag(A)会返回以A中个元素为对角元的方阵;若A为一矩阵,那么diag(A)会提取A的对角元按先后顺序返回一个列向量,diag(diag(A))就可以得到对角矩阵。
- diag(A,k)%若A为一向量,那么diag(A,k)会返回一个以A为第k条超对角线(superdiagonal)/次对角线(subdiagonal)的方阵;若A为一矩阵,那么diag(A,k)会返回一个以A的第k条超对角线/次对角线
- fliplr(A)%若A为一向量,那么返回A的元素倒置输出的向量(例如A=[1 2 3],那么fliplr(A)=[3 2 1])。若A为一矩阵,那么返回A的翻转(例如A=[1 2 3;3 4 5],那么fliplr(A)=[3 2 1;5 4 3])
于是我们计算主、反对角线元素和:
>> sum(diag(A))
ans =
65
>> sum(diag(fliplr(A)))
ans =
65
(1)的验证就完成了,让我们来复习我们现在学习了什么呢?我们学会了生成幻方矩阵,对一个矩阵求行和、列和,学会了求矩阵的对角线元素组成的列向量,学会了翻转矩阵,接着我们简单地介绍如何访问矩阵中的列、行、元素。
(2)
注:A为上述幻方矩阵
- A(m,n)%表示访问A的第m行n列元素,假如访问A中元素时m或n超出了边界会报错,但假如对A超出边界的地方赋值则会新增行/列,除了被赋值的地方,其余新增元素均为0,例如
>> A(6,7)=1
A =
17 24 1 8 15 0 0
23 5 7 14 16 0 0
4 6 13 20 22 0 0
10 12 19 21 3 0 0
11 18 25 2 9 0 0
0 0 0 0 0 0 1
- A(i)%假如把每一列都接在前一列的尾巴上的话,将会形成一个很长的列向量,那么A(i)就是在访问这个列向量的第i个元素,等价于访问A(m,n)其中i≡m(mod 6)(m=0时,m取6),n=[i/6]
- A(m,q:p)、A(q:p,n)%前者表示A的第m行第q到p列,后者表示第n列第q到p行,其实在这里是省略了步长(step),我们用q:step:p来访问从q开始每次经过q+=step直到它超出p边界为止(根据step取正负来判断是小与p还是大于p),假如省略步长,那么默认它为1。我们也可以省略q、p只留一个冒号,就表示全行/列。例如A(m,:)表示第m行。
- A(m:j:n)%,上面提到了步长的概念,那么这里就是针对A(i)的扩展就很好理解了。
于是我们需要访问A的第二、三列怎么做到呢?
>> A(:,2:3)
ans =
24 1
5 7
6 13
12 19
18 25
0 0
今天的matlab内容就是这样啦,可能今天还会复习一篇关于作图的基础题娱乐一下。
一想到晚上又要上卢老爷的课我的内心就一顿哀嚎啊,还是划水做letuce好了。