我的循环代码有什么问题?

时间:2017-11-17 10:22:11

标签: matlab loops

我编写了一个循环代码,将我的表文件名提取为字符串或数组,同时将数据收集到数组中。但是我发现我的代码出错了,因为只有一个文件被读取并在循环中反复重复。我不知道我的代码在哪里出错了,我花了几个小时才找到问题。有人能帮帮我吗?

DataCircle      = dir('*-circle.xls');
MeanAreaCircle  = [];
ColonyNumCircle = [];
PlateNameCircle = [];

for zz = 1:numel(DataCircle)
   basefilenamedata1 = DataCircle(w).name;             % generate the base name
   DataName1         = regexprep(basefilenamedata1,'-circle.xls',''); %replace part of the name and the extension
   PlateNameCircle   = [PlateNameCircle DataName1];    % collect the file name into a string
   T1                = readtable(basefilenamedata1);   % read data in
   MeanAreaCircle    = [MeanAreaCircle mean(T1.area)]; % collect the mean for area
end

我得到的是这样的,这是错误的:

>> PlateNameCircle
PlateNameCircle ='IMG_0813IMG_0813IMG_0813IMG_0813IMG_0813IMG_0813IMG_0813IMG_0813IMG_0813IMG_0813'
>>  MeanAreaCircle
MeanAreaCircle =
   1.0e+03 *
    6.4152    6.4152    6.4152    6.4152    6.4152    6.4152    6.4152    6.4152    6.4152    6.4152

我的输入文件列表:

IMG_0809-CC.xls
IMG_0809-circle.xls
IMG_0810-CC.xls
IMG_0810-circle.xls
IMG_0812-CC.xls
IMG_0812-circle.xls
IMG_0813-CC.xls
IMG_0813-circle.xls

我想要的是一个列或一个字符数组或这样的字符串:

PlateNameCircle = 'IMG_0809' 'IMG_0810' 'IMG_0811' 'IMG_0812' 'IMG_0813'

2 个答案:

答案 0 :(得分:1)

问题

1:您正在使用w索引循环变量的名称,而不是zz。显然,工作区中有一个名为w的杂散变量,等于8.这就是为什么你总是读取同一个文件的原因,无论迭代次数如何。

2:您没有在名称中添加空格:

PlateNameCircle = [PlateNameCircle ' ' DataName1];

3:您在每两次连续迭代中添加相同的名称:

PlateNameCircle = 'IMG_0809-CC IMG_0809 IMG_0810-CC IMG_0810 ...' 

改进

  1. 矢量化并使用单元格字符串

  2. 预分配而非动态增长

  3. 给你的变量提供更好的名字(尽管你已经在那里做得很好,tbh)

  4. 类似的东西:

    filenames       = {D.name};
    PlateNameCircle = regexprep(filenames,'-circle.xls',''); %...doubt this is actually what you want, but it *is* what you've written...
    
    MeanAreaCircle  = zeros(numel(filenames),1);
    ColonyNumCircle = [];  % <- not used?
    
    for zz = 1:numel(filenames)   
       T1 = readtable(filenames{zz});      % read data in
       MeanAreaCircle(zz) = mean(T1.area); % collect the mean for area
    end
    

答案 1 :(得分:0)

我认为

中的 w
basefilenamedata1 = DataCircle(w).name;

应该是 zz 。否则,您总是在查看列表中的第一个文件。