2016-07-08 8 views
0

私はConcert Technologyを介してCPLEXとC++を使用していますが、遭遇する再発問題は内部でIloArray構造がオーバーロードされているようですvector構造参照によってコピーされる演算子を使用します。これはアレイ構造を扱うのに非常にきれいでメモリ効率のよい方法です。CPLEX IloArray、簡単な方法で値をコピーする方法

しかし...これは、以前に宣言してIloIntArray Arrayを初期化するために、IloIntArray Array_copy = Arrayを作ることArray_copyArrayの参照コピーを作成することを意味します。したがって、Arrayの変更は自動的にArray_copyに転送されます。同じことが、add()ルーチンを介して多次元IloArray構造に適用されます。

私たちは、私がi = 1iSizeからArray2D[i]の各位置での保管iSizei = 1にインデックスを付け、ループのために、Arrayの値がどのなります内側に、2D IloArray<IloIntArray> Array2D(env)を移入する必要があること、例えば、言ってみましょうループの反復ごとに異なる。いずれかを作る:

  1. Array2D[i].add(Array)または、
  2. Array2D[i] = ArrayArray2Dのi次元が最初にサイズiSizeのように設定されたと仮定。

i-dimensionの要素を参照するたびに、すべての要素が最後になり、 の値。今

、ほかに、私自身のコピーバイ値演算子を作るコンストラクタ(オプションI)またはコピールーチンオプションII)受信、両方、出発地と目的地(、例えば、多次元配列)の位置と、元の配列がコピーされる場所との間の距離を計算する。

別の方法でコピーを作成する方法はありますか?いずれにしても、これらのオプションのどれがよりきちんとしているか、メモリ効率が良いかを決める手助けができますか?直感的に私は私がより効率的にするオプションを考えるが、私はそれを行う方法がわからない...

感謝を事前にあなたの助け Y

+0

AFAIKでは、配列をコピーする方法を以下に示します。1) 'for'ループ。 2) 'memcpy' 3)DMA 4)アンロールされた(スロットごとに1つの割り当て)。アセンブリ言語を使用する場合は、大きなメモリブロックをコピーするための命令があります。 –

+0

ところで、ポインタと参照の1つの使用は、配列をコピーする(関数に渡すなど)実行コストを避けることです。ポインタや参照を渡すと、大きな配列よりも実行時間と実行時間が短縮されます。 –

+0

私は、ポインタと参照の利用がよりきれいでメモリ効率の良い方法につながると述べました。しかし、それは私がやろうとしていることをやめさせている – Jacko

答えて

0

これまでのところ、私は自分自身を解決していますcopy()機能を実装して問題を解決してください。

次のように私はtypedefed私の多次元配列を持っている:

typedef IloArray<IloIntArray> Ilo2IntArray;typedef IloArray<IloNumArray> Ilo2NumArrayなど3つのまたは4次元の整数または数値配列のために。次のように

私はコピーごとの値のコピーを作成するためのパッチとして使用していますコピー機能の私の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(); 
} 

あなたのご意見および/またはより良い答えは大歓迎です! !!