我对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 ..),所以这没用。
请给我一些建议。
答案 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
和动态循环的成本都是微不足道的。