matlab中常需要顺序读取或命名文件(或文件夹),以读取文件为例。
文件存放在“E:\disk\Data”中,其中又有50个子文件夹,从“s1”到“s50”,每个文件夹里有10张图片,从“1.jpg”到“10.jpg”。希望读取前40个子文件夹,每个文件夹只读取前5张图片作为训练集,后5张作为测试集,程序如下:
addpath ('E:\disk\Data');
ndocument=40;
npicture=5;
train=0;%取0时读取前5张,取其它值读取后5张
for i=1:ndocument
i1=mod(i,10); %获得文件夹号码个位,mod(x,y)取模,取x/y的余数,x和y符号不同时,取y的符号
i0=char(i/10);%在下面的代码中,相当于得到文件夹号码十位(我个人理解i0为i/10整数部分)
docPath='E:\disk\Data\s';
if(i0~=0)%判断十位是否为零,如果不为零,路径中加上十位
docPath=strcat(docPath,'0'+i0);%strcat连接的是char型,‘0’为数字0的ASCII码(48),再加上i0(即文件夹号码的十位),即为文件夹号码十位的ASCII码
end
docPath=strcat(docPath,'0'+i1);%加上文件夹号码的个位,获得文件夹号码路径
docPath=strcat(docPath,'\');
Path=docPath;
for j=1:npicture
picPath=Path;
if train==0;%读取前5张
picPath=strcat(picPath,'0'+j);
else %读取后5张
picPath=strcat(picPath,num2str(5+j));%num2str 将数字转换成char型
end
picPath=strcat(picPath,'.pgm');
img=imread(picPath);
end
end
其中,
1.需要掌握取余运算mod(x,y),此外rem(x,y)也为取余,但两者有区别:
当x和y的正负号一样的时候,两个函数结果是等同的;当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样。
先将两个数x、y看作是正数,作除法运算
①能整除时,其值为0
②不能整除时,其值=除数×(整商+1)-被除数
例:mod(36,-10)=-4
即:36除以10的整数商为3,加1后为4;其与除数之积为40;再与被数之差为(40-36=4);取除数的符号。所以值为-4。
例:mod(9,1.2)=0.6;
①能整除时,其值为0
②不能整除时,其值=除数×(整商+1)-被除数
例:mod(36,-10)=-4
即:36除以10的整数商为3,加1后为4;其与除数之积为40;再与被数之差为(40-36=4);取除数的符号。所以值为-4。
例:mod(9,1.2)=0.6;
2.程序识别文件夹号码为‘s1’、‘s2’、's3'、...........、's10'、's11'、.........、's40'
在我以前编号文件或文件夹时,如果是三位数,编号为‘001’、‘002’、.......、‘010’、‘011’、......、‘100’、‘101’即编号位数必须相同,前面有无效的'0',正是由于没有用好:
strcat(docPath,'0'+i0);%strcat连接的是char型,‘0’为数字0的ASCII码(48),再加上i0(即文件夹号码的十位),即为文件夹号码十位的ASCII码
利用char字符的ASCII码,可直接编号,例如i0是3,那么'0'+i0为51,ASCII码中51代表字符‘3’,即显示3。
此外,要想获得字符的ASCII码,可利用函数
abs(),例如,输入abs('0'),得到0的ASCII码为48,输入abs('a'),得到字a的ASCII码为97。