我在matlab中有以下代码,这是非常慢的。这段代码与我在堆栈溢出中的previous post有关我想知道是否有任何方法可以使matlab更快,同时当我运行代码时应该给我看图,有更新的图片,但它没有显示任何东西
%% Loading Data
cd('D:\MatlabTest\15-07SpeedSensitivity\0.3');
clear all
row=101;
column=311;
%%
%Coefficients Creation
N=5;
W = [0.005 0.10;0.10 0.20;0.20 0.30;0.30 0.40;0.40 0.50;0.50 0.60 ;0.60 0.70;0.70 0.80 ;0.80 0.90;0.90 1.0];
for ind=1:9
wn = W(ind,:);
[b,a] = butter(N,wn);
bCoeff{ind}=b;
aCoeff{ind}=a;
end
[bCoeff{10},aCoeff{10}]=butter(N,0.9,'high');
%%
%filter initialization
ZState = cell(1,10);
for i=1:10
ZState{i} = zeros(max(length(aCoeff{i}), length(aCoeff{i})) - 1, 1); %# This is the initial filter state
end
%%
bands=10;
for b=1:bands
Yout{b}{row, column}=[];
end
%%
j=1;
K = 1000:4000;
window = zeros(1,10);
figure;
y = 0; %# Preallocate memory for output
j=0;
buffSize=10;
tempMean{row,column}=[];
Gibbs=(length(K)*3)/100;
fImg{1}(row,column)=0;
%load one image
for i = 1000:length(K)
disp(i)
str = int2str(i);
str1 = strcat(str,'.mat');
load(str1);
D(:,:) = A(100:200 ,200:510);
%go throught the columns and rows
for p = 1:row
for q = 1:column
%calculte the temporal mean value based on previous ones
if(size(tempMean{p,q})<buffSize) %init the first 10
tempMean{p,q}=[D(p,q) tempMean{p,q}];
else
tempMean{p,q}=[D(p,q) tempMean{p,q}(1:end-1)];
end
if(mean2(tempMean{p,q})==0)
x=0;
else
x = double(D(p,q)/mean2(tempMean{p,q}));
end
%filtering for 10 bands, based on the previous state
for f = 1:10
[y, ZState{f}] = filter(bCoeff{f},aCoeff{f},x,ZState{f});
if(j<Gibbs)
continue;
end
if(size(Yout{f}{p,q})<10)%init the first 10 after Gibbs phenomenon
Yout{f}{p,q} = [y.^2 Yout{f}{p,q}];
else
Yout{f}{p,q} = [y.^2 Yout{f}{p,q}(1:end-1)];
fImg{f}(p,q)=mean2(Yout{f}{p,q});
end
end
end
end
if(size(fImg{1}(1,1))>1)
for k = 1:10
subplot(5,2,1);
subimage(fImg{k}*5000, [0 0.5]);
colormap jet
end
pause(0.01);
end
j=j+1;
end
disp('Done Loading...')`
答案 0 :(得分:1)
好吧,我没有1000.mat
,1001.mat
,...,4000.mat
,所以我无法正确测试。
无论如何,我可以随便告诉你的是
嵌套循环通常是个坏主意。将您的大部分精力放在阻止您拥有的四重嵌套循环上
大多数循环体包含对外部非内置函数的引用(means2
,int2str
,...)。这意味着无法应用JIT编译,for
- 循环以解释器速度运行。
Yout
和fImg
的内容会在每个最里面的迭代上更改大小。应避免改变大小或至少保持非常小的循环。
调整变量大小意味着,Matlab需要创建一个更大的临时变量,将原始数组的内容复制到临时变量,将新数据附加到它,将temp变量赋值给原始变量,以及收拾残局。正如您所理解的那样,所有这些无意义的复制都需要花费大量时间才能完成很多次(您可以这样做),因此:努力预分配整个数组。
除此之外,我们不能没有mat
文件。正如@slayton所建议的那样,学会使用Matlab profiler。我突出显示的要点可能会跳出来(加载数据也是如此,但是无法改进(除非所有数据文件适合你的内存?)