如何改进此代码的Matlab性能?

时间:2014-08-25 02:33:40

标签: performance matlab for-loop combinations allocation

Adn custo 是相同大小的向量,长度为10252个元素(长度(Adn)= 10252)。 custo 中的每一行值都与 Adn 中相同行值的成本相对应。我正在尝试获取 Adn 中值的所有可能组合的总和,并分析该组合的成本。从Adn组合中,我只对那些总和到特定区间(低于总和(A)且大于总和(A)* 0.9)的组合感兴趣。 A 以前写在代码中,所以现在没关系。然后我想将组合及其等价成本( custoAll )存储在两个新向量中。

nA=numel(Adn);
for k1=1:nA
   B=combntns(Adn,k1);
   C=sum(B,2);          
   E=combntns(custo,k1);
   F=sum(E,2);
   D=find(((C<(sum(A)))&(C>(sum(A)*0.9))));
   if ~isempty(D)
       combinations=[combinations; B(D,:)];
       custoAll=[custoAll; F(D)];
   end          
end

这段代码需要很长时间。我知道我应该在循环中预先分配变量组合 custoAll ,否则它会在每次迭代中改变大小并运行更长时间,但我无法找到这是一个很好的方法,因为Adn已经非常庞大了。有没有人对此有所了解?

新解释:

我正在处理15个不透水区域,其中7个可以成为渗透性路面的基础。首先,我总结了这15个区域的所有可能组合,并将它们中的每一个与7个可能的基础中的一个配对。但后来我过滤了这些数据,因为我不需要所有数据。我将这些总和与基地配对,因为我正在计算每个新区域的路面成本,它将负责从中吸收水。

Adn拥有所有这些可能的面积总和(来自15的组合)。在过滤数据之后,仅考虑3个可能的基数和47个Adn元素,让我们说:

Adn =

3.8825e+002
2.2850e+002
5.7470e+002
2.1700e+002
4.6175e+002
4.5025e+002
2.9050e+002
6.3670e+002
5.2375e+002
3.0675e+002
6.5295e+002
2.9525e+002
3.8825e+002
7.2645e+002
3.6875e+002
4.6175e+002
7.1495e+002
8.0795e+002
4.5025e+002
7.8845e+002
8.8145e+002
5.2375e+002
8.6995e+002
9.4345e+002
6.5295e+002
4.9320e+002
1.4746e+003
4.8170e+002
5.7470e+002
7.2645e+002
1.7079e+003
7.1495e+002
8.0795e+002
1.5481e+003
5.5520e+002
6.4820e+002
1.5366e+003
1.6296e+003
6.3670e+002
7.8845e+002
8.8145e+002
8.6995e+002
1.6101e+003
1.7031e+003
7.1020e+002 
1.6916e+003
9.4345e+002

bases = 

1.5500e+002
1.5500e+002
1.5500e+002
1.5500e+002
1.5500e+002 
1.5500e+002
1.5500e+002
1.5500e+002
1.5500e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002
2.3325e+002  
2.3325e+002
4.1970e+002 
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002  
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002 
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002
4.1970e+002

custo =

3.3184e+002
1.5643e+002
5.7444e+002
1.4524e+002
4.2319e+002
4.0851e+002
2.2032e+002
6.6251e+002
5.0468e+002
1.8913e+002
5.5301e+002
1.7896e+002
2.6526e+002
6.4210e+002
2.4643e+002
3.3941e+002
6.2793e+002
7.4492e+002
3.2749e+002
7.1995e+002
8.4108e+002
4.0559e+002
8.2583e+002
9.2459e+002
5.3313e+002
3.5550e+002
1.6830e+003
3.4348e+002
4.4374e+002
6.2093e+002 
2.0652e+003
6.0696e+002
7.2232e+002
1.8012e+003 
4.2215e+002
5.2757e+002
1.7825e+003
1.9347e+003
5.1420e+002
6.9769e+002
8.1717e+002
8.0212e+002
1.9025e+003
2.0572e+003
6.0122e+002
2.0379e+003
8.9955e+002

custo为我提供了每对Adnbase(换句话说,每个可能的路面)的费用。

现在我的问题:我想制作这些路面的新组合(因此组合中的基础应该是唯一的)。我对路面的所有组合感兴趣,他们的Adn值(区域)组合将总和到特定的间隔。假设我的间隔是3000和0.9 * 3000。由于我合并了人行道,他们的成本也会总和。然后我想得到成本更低的组合。

0 个答案:

没有答案