今天师兄提出一个问题
要快速的生成如下的矩阵
1 | 1 | 1 | 1 | 0.5 |
1 | 1 | 1 | 0.5 | 0 |
1 | 1 | 0.5 | 0 | 0 |
1 | 0.5 | 0 | 0 | 0 |
0.5 | 0 | 0 | 0 | 0 |
我思考了一下,对于数据量不大的完全可以用循环来做,奈何本人有matlab综合症,不矩阵简化的话活不了
所以解答如下:
a=ones(5,5);提前申请矩阵空间
a=triu(a)-0.5*diag(ones(1,5));ones(1,5)生成diag对角线元素
a=fliplr(a);左右顺序颠倒
这个方法省去了繁琐的循环和判断赋值
下面对用到的函数和核心思想做简要说明:
1.matlab的核心在于矩阵,像一般的循环之类的都可以用内置函数(ones,meshgrid,linspace等)来代替,这样不仅代码简洁,还大大提高了代码运行效率,符合matlab矩阵至上的原则
2.提前申请矩阵空间和索引向量化或矩阵化是基本的原则
3.灵活转换->本文中代码先用ones生成5*5的全部元素为1的矩阵,然后用triu提取了上三角部分(包括对角线),然后用diag生成了对角线是0.5 的同样大小的矩阵,二者相减发现和想要的还有点差别,再发现用fliplr左右顺序颠倒一下就OK了。这个只要结构类似,能够各个部分分离的多几步转换就得到了想要的。
类似的操作在实际需求中很多,写下来和大家分享,窥一斑而见全豹,希望对大家有所启发。