Matlab新手求救,如何提高这段程序的运算效率

问题描述:

Matlab新手求救,如何提高这段程序的运算效率
m(1:115)=[1:115];
fname=cell(115,1);
M=zeros(321,528,115);
Mean=zeros(1,115);
stripeband=zeros(321,528,18);
Nostripeband=zeros(321,528,97);
stripebandmean=zeros(1,18);
Nostripebandmean=zeros(1,97);
upper1=zeros(321,528,1);
lower1=zeros(321,528,1);
upper2=zeros(321,528,97);
lower2=zeros(321,528,97);
upper=zeros(321,528,97);
upper2D=zeros(321,528);
lower12D=zeros(321,528);
upperall2D=zeros(321,528);
lower22D=zeros(321,528);
upper11=zeros(321,528,97);
lower11=zeros(1,1);
lower22=zeros(1,97);
upperall=zeros(1,97);
lowerall=zeros(1,97);
r=zeros(1,97);
jj=1;
kk=1;
for ii=1:length(m)
fname(ii)={strcat('波段',num2str(ii),'灰度图像')};
[K,mean]=Correlationcoefficient(char(fname(ii)));
M(:,:,ii)=K(200:520,112:639);
Mean(1,ii)=mean;
indicator(ii)=randindicator(char(fname(ii)));
if indicator(ii)>1.200000
stripeband(:,:,jj)=M(:,:,ii);
stripebandmean(1,jj)=Mean(1,ii);
jj=jj+1;
elseif indicator(ii)
1个回答 分类:综合 2014-09-23

问题解答:

我来补答
我先就第一段for循环提点想法吧:由于你的数据维度比较大,不太方便直接矩阵话操作,所以先保留循环;不过有可能的话,把stripeband等三维矩阵压缩二维(即把其中的每一个矩阵都展开成向量保存),会方便很多.毕竟,matlab是最擅长二维矩阵运算的.
cell矩阵的访问可以直接用花括号,比如fname{ii}matlab现在已经对for循环做了优化,而索引(从矩阵里取数)的操作相对慢,所以一些中间变量(比如fname,Mean,M,indicator)其实没必要用矩阵把所有的都存下来,只要存当前循环中的值即可;还有就是向量(1*N矩阵)不需要用二维索引.我最后改成了这样
for ii=1:length(m)
    fname = sprintf('波段%d灰度图像', ii); % 取代strcat和str2num两次函数调用
    [K,mean]=Correlationcoefficient(fname);
    TMP=K(200:520,112:639);
    indicator = randindicator(fname);
    if indicator>1.200000
        stripeband(:,:,jj)=TMP;
        stripebandmean(jj)=mean;
        jj=jj+1;
    else %elseif indicator<=1.200000
        Nostripeband(:,:,kk)=TMP;
        Nostripebandmean(kk)=mean;
        kk=kk+1;
    end
end
再问: 您说的这段程序计算时间几分钟就可以运行结束,主要的问题是cc=1以下的这些for循环,运算起来时间特别长,我想解决这个问题,您有好的办法吗?
再答: 我对matlab加速挺t挺感兴趣的,我白天有事情,晚上再看看。 另外,就算帮忙了,您看一下第一段for修改以后会不会有一些加速,可以先用tictoc试试,当然也可能你主要的时间在两个函数里,这时可能要用profile看看详细的时间开销。
 
 
展开全文阅读
剩余:2000
下一页:请说清为什么