2011-10-21 4 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#에서도 쉽지 않습니다. –

관련 문제