在Matlab中嵌套循环的数量不同

时间:2013-06-07 10:45:49

标签: matlab

我对Matlab中不同数量的for循环有疑问。我生成了一些不同的数据文件夹,每个文件夹都包含一些.mat文件。我需要做的是从这些文件夹中的那些文件生成所有可能的组合(但不是同一文件夹中的文件)。所以基本上算法是:

For i = 1: number of files in folder 1
  For j = 1:number of files in folder 2
    ............................
      For m = 1: number of files in folder n
        Read file i in folder 1
        Read file j in folder 2
        ......................
        Read file m in folder n
        Result file = sum of data in those files %at last we have n-Dimension matrix

      end;
   end;
 end;

如果我们可以修复文件夹的数量,这已经完成,但文件夹的数量因输入参数而异,所以我找不到合适的解决方案。 我也读过有关递归算法的内容,但我不清楚如何做到这一点。 例如,使用递归算法:

我有一个向量,显示每个文件夹中的文件数A = [2,3,4](3个文件夹)。

Function Recursive (n, A) % n = 3
  if (n>1)
    Recursive (n-1, A)
  else
    for i = 1: A(n)
     Read file i in folder n;
    end;
  end 

这里我们无法知道以前的变量(j,k ..),所以这没用。

请给我一些建议。

2 个答案:

答案 0 :(得分:0)

首先,阅读。你不应该做的比你绝对要做的更多。如果您可以将所有内容自由存储在内存中,请执如果你不能,但如果你实际上正在做一些事情,比如在文件中求和数据,计算每个文件的总和并存储它们(可能在每个文件夹有一个向量的单元格中)。如果你以递归方式调用函数,你也希望这样做(使用汇总统计信息而不是整个.mat文件) - 你不希望将整个.mat文件倒入最内层循环的每次迭代的新函数中。

对于实际循环,我建议使用一个主循环,其计数器从1到每个文件夹中文件数的乘积。在那个循环中,我会测试看看我在更新什么。像

这样的东西
BigOutputArray=zeros(A);
P=prod(A);
cumprod=cumprod(A);
S=zeros(n,1);    
currindex=num2cell(ones(n,1));
for ii=1:n
    S(ii)=SumsOfMatFiles{ii}(1);
end
for ii=1:prod(A)
    jj=max([0,find(~mod(ii,P))])+1;
    thissum=sum(S);
    BigOutputArray(i)=thissum;
    S(jj)=SumsOfMatFiles{jj}(currindex(ii)+1);
    currindex(ii)=currindex(ii)+1;
end

这假设SumsOfMatFiles是一个很好的单元格,包含n个包含总和的数组,并且.mat文件之间没有交互。如果不是,则将S替换为包含n组.mat文件内容的单元格数组,并将sum(S)替换为相应的函数,必要时使用S {:}。

答案 1 :(得分:0)

我赞成转换m动态嵌套循环,每个长度为n

for i1=v{1}
   ...
      for im=v{m}
         f(i1,...,im)=F(i1,...,im);
      end
   ...
end

进入m*n组合列表:

I=combvec(v{1},...,v{m}); 
for i=I
   f(i)=F(I(i));
end
f=reshape(F,m,n);

v是一个可变大小的单元格,带有m个元素,用于定义循环的元素。 v{i}是第i个循环的索引行向量。

循环索引不一定必须是固定长度n。对于那种情况,代码是相同的,可以看出。

两个结果都会在f之前返回m的矩阵n

中心成本始终是评估函数F,它必须采用动态数量的参数。

两个循环的复杂度都是 O(n ^ m),但动态循环无法以任何已知的方式进行编程,无需递归。

与评估函数I相比,处理和存储索引F和动态循环的成本都是微不足道的。