Matlab中如何减少循环尽量对矩阵操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)));

由此看出后者程序是多么简单明了。

相关文档
最新文档