matlab for 优化,MATLAB for循环优化三例

最近一周,对MATLAB有进行了新一轮的学习,对其矩阵化编程的思维有了更深入的了解。确实精妙!

例1:

将矩阵A= [1 2 3; 2 4 3; 3 4 5]中所有的数字3替换为33.

如果还停留在C语言的思维可能就是

1

2

3

4

5

6

7

8

9

10

11

12>>for i=1:3

for j=1:3

if A(i,j)==3

A(i,j) = 33;

end

end

end

>> A

A =

1     2    33

2     4    33

33     4     5

而MATLAB语言则有更灵活的语法,

1

2

3

4

5>> A(A==3) = 33

A =

1     2    33

2     4    33

33     4     5

这句的意思就是讲matlab中等于3的数复制为33;

1

2

3

4

5>> A==3

ans =

0     0     1

0     0     1

1     0     0

当在MATLAB中输入A==3

1

2

3

4

5>> A==3

ans =

0     0     1

0     0     1

1     0     0

得到的是一个逻辑数组,接下来的复制操作只对逻辑为真的部分进行。显然后一种写法代码更加简洁。

例2

将A= [1 2;2 3; 3 4; 4 5]每行视为坐标;将5阶零矩阵的这四个位置复制为1;

继续常规思维,也是最正常的思维就是每个位置赋值:

1

2

3

4

5

6

7

8

9

10

11

12>> A= [1 2;2 3; 3 4; 4 5];

B = zeros(5);

for i=1:4

B(A(i,1),A(i,2)) = 1;

end

>> B

B =

0     1     0     0     0

0     0     1     0     0

0     0     0     1     0

0     0     0     0     1

0     0     0     0     0

这里可以使用sub2ind这个函数,从字面意思已经知道,是将下标转换为索引值,具体原理可以help sub2ind以及type sub2ind(查看源码)

所以可以直接写成

1

2

3

4

5

6

7

8

9>> A= [1 2;2 3; 3 4; 4 5];

>> B = zeros(5);

>> B(sub2ind(size(B), A(:,1), A(:,2)))=1

B =

0     1     0     0     0

0     0     1     0     0

0     0     0     1     0

0     0     0     0     1

0     0     0     0     0

深刻体会到矩阵处理问题的简洁之美!

例3

统计矩阵A = [1 3 4; 5 3 2; 4 2 1]中3的个数

如果还停在初学C语言的思维,恐怕又是靠for解决问题

1

2

3

4

5

6

7

8

9

10

11

12>> A = [1 3 4; 5 3 2; 4 2 1];

>> a = 0;

>>for i=1:3

for j=1:3

if A(i,j)==3

a = a+1;

end

end

end

>> a

a =

2

这使如果知道find函数和length函数,就会轻松不少:

1

2

3>> length(find(A==3))

ans =

2

总结,通过以上三个例子,可以看到:

1、学习一门新的东西,一定要把握其精髓,不要固定步自封(比如一味使用for循环)、生搬硬套;

2、就我现在体会,学习matlab最重要的是学习它丰富的函数和灵活的语法,也就是说这门语言处理运算的思维。

3、作为一个技术人员,一定要偷懒,抠门。什么是偷懒,相同的功能,能用一行代码解决绝不用两行,什么是抠门,用最简洁的思维,最快的时间、最小的内存。

4、敢想敢做,敢想:为什么不能用一行代码解决;敢做,敢于通过学习实现自己的想法。

2015-12-13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值