Matlab中如何减少循环尽量对矩阵操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab基础是矩阵运算,它的优势就是矩阵运算的程序简洁、快速。虽然也提供了程序流程的控制语句,如for、while、if、else、switch、try、catch等等,但是应少用,特别是循环语句for、while,费时费事,编写程序时想法尽量避免过多的循环,能有矩阵运算代替是更好的选择,这样编出的程序也简单明了。那么实际编程中应如何减少循环而采用矩阵运算呢?这个问题没有统一的答案,需要结合实际情况,这里举几个例子来说明。
(1)图像的小波阈值降噪
利用二维离散小波变换对图像进行降噪是一种常用的图像降噪手段,其中比较简单典型的方法就是硬阈值法,其基本思想是:对小波分解后的高频系数,一般认为其绝对值比较大的主要反映了信号本身的特征,绝对值比较小的系数反映的多是噪声信息,于是可以事先确定一个阈值,当高频系数的绝对值小于阈值时让其为0,反之则保留。
这里先用循环的方法编写程序,然后再用矩阵操作的方法编写,请大家对比。
load tire; %打开一幅图像
[m n]=size(X);
X0=X+randn(m,n).*10; %加噪声
[cA1,cH1,cV1,cD1] = dwt2(X0,'bior3.7'); %小波分解
th=60; %指定一个阈值,可以参考其他资料了解阈值确定方法
[m1 n1]=size(cH1);
for i=1:m1
for j=1:n1
if abs(cH1(i,j))<>
cH1(i,j)=0;
end
if abs(cV1(i,j))<>
cV1(i,j)=0;
end
if abs(cD1(i,j))<>
cD1(i,j)=0;
end
end
end
Xn= idwt2(cA1,cH1,cV1,cD1,'bior3.7'); %小波重构
figure(1); %显示原图像、加噪图像、降噪图像
subplot(131);imshow(X,map);
subplot(132);imshow(X0,map);
subplot(133);imshow(Xn,map);
如果不用循环,程序如下:
load tire;
[m n]=size(X);
X0=X+randn(m,n).*10;
[cA1,cH1,cV1,cD1] = dwt2(X0,'bior3.7');
th=60;
cH=abs(cH1)-th; %让矩阵取绝对值减去阈值
cH1=(cH>0).*cH1; % cH元素>0则其为1,否则为0,再与原来的矩阵.*即可。
cV=abs(cV1)-th; cV1=(cV>0).*cV1;
cD=abs(cD1)-th; cD1=(cD>0).*cD1;
Xn= idwt2(cA1,cH1,cV1,cD1,'bior3.7');
figure(1);
subplot(131);imshow(X,map);
subplot(132);imshow(X0,map);
subplot(133);imshow(Xn,map);
两种程序结果均一样,看图。当然直接用小波工具箱中的ddencmp等函数是另外一回事了。上述程序一方面是为了说明如何减少循环,另一方面该程序采用的降噪方面也叫硬阈值法,你可以在此基础上进行多层分解、改进得到软阈值法、指数阈值法等等其他降噪的程序,这是采用ddencmp函数难以达到的。
(2)求矩阵元素减去某个值后的最小值所在的位置
这是作者实际编程中遇到的一个问题:要求程序对矩阵seljitt的第4、6列分别减去某个值ug、dg,然后求两个差的绝对值的和最小的行号。
用循环的方法如下:
[sizen m]=size(seljitt); %求矩阵的行数
minv=100000; %设定一个极大值用于后面的比较
for i=1:sizen
LS1=abs(seljitt(i,4)-ug)+abs(seljitt(i,5)-dg);
if LS1
minv=LS1;num=i;
end
end % num就是所要求的行号
改用矩阵运算如下:
[minv num]=min(abs(seljitt(:,4)-ug)+abs(seljitt(:,5)-dg)));
由此看出后者程序是多么简单明了。