我编写了一个将图像转换为文本文件以进行光刻的代码。图片为高分辨率(26.5kx 26.5k),文本文件超过 2MB。我的问题是代码需要很长时间才能工作,我怀疑它与内存碎片有关(我不是经验丰富的程序员,特别是刚开始使用 MATLAB)。它在两个地方滞后:在您必须选择要使用的特定图像之前,以及在处理它之后。
在处理部分,我从 MATLAB 中得到以下评论:
指示的变量或数组的大小似乎随着每次循环迭代而变化。通常,出现此消息是因为数组通过赋值或连接而增长......
但是还有这部分:
如果满足以下任一条件,则可能适合禁止显示此消息,如调整代码分析器消息指示器和消息中所述: 循环代码包含数组增长的条件块。(在这种情况下,只有在循环找到这样的条件时才增长数组是合理的。)对于循环中的每次迭代,连接的长度会有所不同(例如具有可变长度的字符向量)。在进入循环之前,数组的总大小是无法计算的。
输出文本文件很大程度上取决于提供的图像和其中的黑白像素数。
所以我想知道是否有任何方法可以提高代码的性能?
在选择图像文件之前,几乎没有任何计算,携带的也很简单,不知道为什么这么慢。
对于第一个函数,就在调用打开图像文件的第二个函数之前:
function print_contacts(pixl, size, xRd, yRd, zRd, xRu, yRu, zRu)
meas_L=3960.05; % the lateral and veritcal measured distance e.g. 4900.5 between large pluses, 3960.05 between dots in corners
%%
conv=(size*1000)/pixl;%0.267;%0.4215; % pixel to microns
siz=pixl*conv;
xLd=0.0;
yLd=0.0;
zLd=0.0;
%%
delta_x_H=xLd-xRd;
delta_y_H=yLd-yRd;
delta_z_V=-(zLd-zRd);
delta_x_V=xRu-xRd;
delta_y_V=yRu-yRd;
delta_z_H=-(zRu-zRd);
%% find x-y angle of rotation teta (if teta is positive then rotation is clockwise)
if yRd > 0
teta_xy=atand(-xRd/yRd)-90;
else
teta_xy=atand(-xRd/yRd)+90;
end
%% find x-z angle of rotation teta (if teta is positive then rotation is clockwise)
teta_xz=atand(delta_z_H/delta_x_H);
%% find y-z angle of rotation teta (if teta is positive then rotation is clockwise)
teta_yz=atand(delta_z_V/delta_y_V);
%%
del_z_H=delta_z_H/meas_L*conv*pixl;
del_z_V=delta_z_V/meas_L*conv*pixl;
vec_xz=linspace(0,del_z_H,pixl);
vec_yz=linspace(0,del_z_V,pixl);
[X,Y] = meshgrid(vec_yz,vec_xz);
Z1=(X + Y);
shift=Z1(pixl/2,pixl/2);
valZ=round((Z1-shift),2);
%surf(valZ);
con=[conv];
R = [cosd(teta_xy) -sind(teta_xy); sind(teta_xy) cosd(teta_xy)];
PPM.Y=con;
PPM.X=con;
regionpropsApply(PPM, valZ, siz, R, conv)
之后是regionpropsApply
允许您选择图像文件并将其分割成单个图像的函数,每个图像将由第三个也是最后一个函数处理成一个文本文件,其中我有这个命令收集一个长字符串,它将进入文本文件:
str2File = [str2File;cmdJump;cmdZ;cmdMov];
其中cmdJump
和是在此特定迭代中创建的命令cmdZ
。cmdMov
在迭代之前,我已经知道所需的迭代次数。每次迭代都将始终包含这 3 个命令。每个图像(从原始图像中分割出来的)都被单独处理。我应该什么时候预分配内存以及如何预分配内存?
目前,执行代码需要 40 多分钟,考虑到输出文件只有 2MB 的事实,我真的希望它不到几分钟。