【发布时间】:2019-06-23 12:00:11
【问题描述】:
我编写了一个代码,可以将图像转换为用于光刻的文本文件。图片为高分辨率(26.5k x 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 的事实,我真的希望不到几分钟。
【问题讨论】:
-
你分析过代码吗?它会告诉你所有时间都花在了哪里。 mathworks.com/help/matlab/ref/profile.html
-
我不知道这是可能的,由于其他方法没有多大作用,很遗憾,我会尝试一下。谢谢!
标签: arrays image matlab memory-management pre-allocation