2016-07-08 6 views
0

CPLEX 및 C++에서 Concert Technology를 통해 작업하고 있으며 발생하는 반복되는 문제는 내부적으로 IloArray 구조가 오버플로되는 것 같습니다 vector 구조 참조 단위 복사 (copy-by-reference) 연산자. 내가 알아야 할 것은 배열 구조를 다루는 아주 청결하고 메모리 효율적인 방법이다.CPLEX IloArray, 쉬운 방법으로 값을 복사 (참조하지 않음)하는 방법

그러나 ...이 의미를 들어, IloIntArray Array_copy = Array을 그 이전에 선언 Array_copyArray의 참조 복사본을 만들 것입니다, IloIntArray Array 초기화. 따라서 Array의 변경 사항은 자동으로 Array_copy으로 전송됩니다. 동일한 내용이 add() 루틴을 통해 다차원 IloArray 구조에 적용됩니다.

우리가 내가 i = 1iSize-Array2D[i]의 각 위치에 저장 iSizei = 1에 색인, 루프를 들어, Array의 값이있는있을 것 안에, 2 차원 IloArray<IloIntArray> Array2D(env)를 채울 필요가 예를 들어, 가정 해 봅시다 루프의 반복마다 다릅니다. 제작 중 : I-차원이 처음에 크기 iSize의로 설정 한 Array2D 가정

  • Array2D[i] = Array

    1. Array2D[i].add(Array) 또는,.

    매번 i- 치수의 요소에 대한 참조가 복사되고 마지막 요소와 동일한 모든 요소로 끝나기 때문에 값으로 복사를 수행하지 못합니다. 값

    지금, 게다가, 내 자신의 복사하여 값 운영자 생성자 (옵션 I) 또는 을 일상 (옵션 II) 수신, 둘 다 출발지와 목적지를 복사 배열뿐만 아니라 원점 배열을 복사 할 대상 배열 (, 예 : 다차원 배열)의 위치를 ​​지정합니다.

    다른 방법으로 값을 복사 할 수 있습니까? 어떤 경우이 옵션 중 어느 것이 더 깔끔하고 메모리가 효율적인지 결정하는 데 도움을 줄 수 있습니까? 직관적으로 나는이보다 효율적으로 할 수 옵션하다고 생각,하지만 난 그것을 할 방법을 모른다 ...

    감사를 사전에 도움을 Y

  • +0

    AFAIK, 배열 복사 방법은 다음과 같습니다. 1)'for' 루프. 2)'memcpy' 3) DMA 4) Unrolled (슬롯 당 하나의 할당). 어셈블리 언어를 사용하는 경우 일부 프로세서에는 큰 메모리 블록을 복사하기위한 지침이 있습니다. –

    +0

    BTW, 포인터 및 참조 중 하나를 사용하면 배열 복사 (예 : 함수 전달)의 실행 비용을 피할 수 있습니다. 포인터 또는 참조를 전달하면 큰 배열보다 공간과 실행 시간이 적게 걸립니다. –

    +0

    그래서 내가 포인터와 참조의 활용이 더 깔끔하고 메모리 효율적인 방법으로 인도한다고 언급 한 이유입니다. 그래도, 내가하려는 일을하지 못하게하고있다. – Jacko

    답변

    0

    지금까지 난 내 자신을 해결하고 copy() 함수를 구현하여 문제를 해결하십시오.

    다음과 같이 내가 typedefed 내 다차원 배열을 가지고 :

    typedef IloArray<IloIntArray> Ilo2IntArray;typedef IloArray<IloNumArray> Ilo2NumArray 등 세 가지 또는 네 가지 차원의 정수 또는 숫자 배열.다음과 같이

    내가 복사하여 값 복사를 만들기 위해 패치로 사용하고있는 복사 기능의 내 Ilo3IntArray copy(Ilo3IntArray origin) 과부하의 예는 다음과 같습니다

    Ilo3IntArray copy(Ilo3IntArray origin) { 
    
    IloInt iSize = origin.getSize(); 
    Ilo3IntArray destination(env, iSize); 
    IloInt jSize = origin[0].getSize(); 
    IloInt zSize = origin[0][0].getSize(); 
    
    for (IloInt i = 0; i < iSize; i++) { 
        destination[i] = Ilo2IntArray(env, jSize); 
    
        for (IloInt j = 0; j < jSize; j++) { 
         destination[i][j] = IloIntArray(env, zSize); 
    
         for (IloInt z = 0; z < zSize; z++) { 
          destination[i][j][z] = origin[i][j][z]; 
         } 
        } 
    } 
    
    return destination; 
    
    // Freeing Local Memory 
    destination.end(); 
    } 
    

    여러분의 의견 및/또는 더 나은 답변을 환영합니다! !! !!