1

我对 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..),所以这是没用的。

请给我一些建议。

4

2 回答 2

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{:}。

于 2015-01-27T06:45:32.787 回答
0

我赞成转换m动态嵌套循环,每一个都是 length 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。可以看出,这种情况下的代码是相同的。

两个结果都返回一个by的矩阵fmn

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

两个循环的复杂度都是O(n^m),但是动态循环不能以任何已知的方式在没有递归的情况下进行编程。

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

于 2016-07-06T21:38:28.653 回答