原文首发于blog.scloud.com,转载请注明出处
MATLAB不是C语言,名字中都出现了MAT,在操作MAT时怎么还能用for循环!
在C语言的思路中,如果要对一个二维矩阵每个元素进行某种操作,似乎唯一的方法就是写两层for循环遍历整个矩阵。但是在MATLAB中,这种写法不仅代码量大,运行效率也极低。但是这绝不代表MATLAB时一门低效的语言。相反,MATLAB对矩阵操作进行了大量的优化,只要使用得当,不仅写法简便,效率也会高得出奇
矩阵赋值
让MATLAB操作矩阵变得便利的基础之一就是:MATLAB中可以使用索引
对整个矩阵进行操作。这个索引可以是与矩阵相同大小的逻辑矩阵,也可以是元素的位置
向量
a = zeros(2,2);
b = [true, true; false, false]; % 使用逻辑矩阵对整个矩阵进行操作
a(b) = 1;
a = zeros(2,2);
b = [1, 3]; % 使用`元素位置`向量对整个矩阵进行操作
a(b) = 1;
两种方式得到的a的值均为
a =
1 1
0 0
使用索引的操作,从本质上改变了如果要对整个矩阵进行操作必须进行for循环遍历的思维方式。这种使用索引的操作方式配合各种MATLAB函数,能够创造无尽可能
find函数
假设我们遇到了这个问题:已知有四张二值图 B1,B2,B3,B4,要对它们进行如下操作得到 R
R=(R1⋂R2)⋃(R1⋂R3)⋃(R1⋂R4)⋃(R2⋂R3)⋃(R2⋂R4)⋃(R3⋂R4)
R=(R1⋂R2)⋃(R1⋂R3)⋃(R1⋂R4)⋃(R2⋂R3)⋃(R2⋂R4)⋃(R3⋂R4)
如果使用C语言的思想,用for循环来实现的话那么代码量将是巨大的。但换一种思路,依照MATLAB面向矩阵的思路,配合MATLAB中一些神函数就能在几行代码内实现这么复杂的并集交集操作,比如find函数
find函数返回矩阵中满足特定条件的元素的位置索引向量,使用find我们可以方便地找到我们希望进行操作的元素,并对其进行赋值或者进一步操作。
R = zeros(size(R1));
findR1 = find(R1==1);
findR2 = find(R2==1);
findR3 = find(R2==1);
findR4 = find(R4==1);
R(union(union(union(union(union( ...
intersect(findR1, findR2), intersect(findR1, findR3)), ...
intersect(findR1, findR4)), ...
intersect(findR2, findR3)), ...
intersect(findR2, findR4)), ...
intersect(findR3, findR4))) = 1;
上面的代码中,我们将输入矩阵中值为1的元素(即我们希望进行操作的元素)的位置索引赋给findR1 - findR4,然后对这些位置索引进行求交求并操作,并将结果作为R的索引对其进行赋值
bsxfun函数
使用find对矩阵进行求交求并操作仍然比较复杂,先要对位置索引进行交并操作,然后才能对矩阵进行赋值,能不能直接在矩阵上一步到位地达到我们的目的?
这里推出我们第二个神级函数bsxfun。bsxfun可以对两个矩阵中的每个元素进行相同操作,并且其内置了很多实用的函数句柄,比如or与and,使用bsxfun一行代码就可以完成任务
R = bsxfun(@or, bsxfun(@or, bsxfun(@or, bsxfun(@or, bsxfun(@or, ...
bsxfun(@and, R1, R2), bsxfun(@and, R1, R3)), ...
bsxfun(@and, R1, R4)) ,...
bsxfun(@and, R2, R3)), ...
bsxfun(@and, R2, R4)), ...
bsxfun(@and, R3, R4));
作者:9thRiver
来源:CSDN
原文:https://blog.csdn.net/qq_19983271/article/details/80136071
版权声明:本文为博主原创文章,转载请附上博文链接!
网友评论