2011-10-21 3 views
0

私のリストには、プロジェクトの中で整数の2次元配列が含まれているliという名前のリストがあります。私は配列の等しいインデックスの最大値を持って、array2という名前の新しい配列を作成したいと思います。私はこのコードを書いたが、それは遅い。リスト内に存在する配列の等価インデックスの最大値に達する

for (int i = 0; i < 100; i++)//the size of each array is [100,100] 
    for (int j = 0; j < 100; j++) 
    { 
     int ma = -2; 
     int d = 0; 
     while (d <= f)//"f" is the number of items in the list 
     { 
      ma = Math.Max(ma, Convert.ToInt32(li[d].GetValue(i, j))); 
      d++; 
     } 

     array2[i, j] = ma; 

    } 

どのようにすればよいですか? emguCvを使用して改善することはできますか?はいの場合は、どうすればいいですか?ありがとうございます。 ですから、li要素にアクセスするためにボクシングは/アンボクシングを持っていません

ma = Math.Max(ma, li[d][i, j]); 

GetValueが要素にアクセスするには遅い方法です(:liは、整数の配列がある場合に

+2

現時点であなたの質問を理解することは難しいです。あなたの質問の本文とタイトルがそれぞれ独立しているように、コードをより慎重に書式設定するのと同様に、短いが完全な例が役立ちます。 http://tinyurl.com/so-hintsを読んでください –

+0

私は作品が欠落していると言うでしょう。あなたは 'named li 'で始まり、 – xanatos

答えて

1

は、あなたのコードを変更することができますそれをより明確にする配列)

の:

int[,] temp = li[d]; 
ma = Math.Max(ma, temp[i, j]); 
+0

コードは機能しませんでした。代わりに、私はこれを使いました:int [、] temp = new int [picP.Height、picP.Width]; Array.Copy(li [d]、temp、li [d] .Length); ma = Math.Max(ma、temp [i、j]);そして非常に遅い –

+0

@AsmaGood 'li [d]'のタイプは何ですか?あなたは '' li''がどのように定義されているのか書いていません。 – xanatos

1

私はあなたの時間の複雑さを変更することができるとは思いませんあなたのコードの。現時点では、n²·f要素にアクセスしてarray2は2次元配列のサイズ)を作成する必要があるため、コードの複雑さはO(n²·f)です。

反復の順序を変更することはできますが、複雑さは変わりません。それはGetValueの実装に依存し、もう少しキャッシュ優しいかもしれない:

for(int d=0; d<f; d++) 
{ 
    var arr = li[d]; 

    for(int i=0; i<100; i++) 
    { 
     for(int j=0; j<100; j++) 
     { 
      array2[i,j] = Math.Max(array2[i,j], Convert.ToInt32(arr.GetValue(i,j))); 
     } 
    } 
} 

あなたの現在のコードと互換性を持たせるために、このコードを実行する前に、-2array2の各値を初期化する必要があります。

コードを並列化し、array2の異なる部分を計算する複数のワーカースレッドを使用するとよいでしょう。 4.0フレームワークを使用している場合は、Parallel classを使用することができます。

+0

あなたの試みをありがとう、私はあなたのコードを試しましたが、それは遅いです。 –

+0

ええ、試してみる価値はありましたが、私が言ったように、時間の複雑さを改善する方法はありません。したがって、低レベルの最適化または並列化のいずれかです。低レベルの最適化は、CやC++のようにC#では簡単ではありません。 –

関連する問題