2016-04-14 15 views
1

サイズ259,920の長いベクトルから361 X 720のマットに変換しようとしました(matlabのvect2matと同じ概念です)。コードは動作しますが、試したときHTC電話機では、応答に1秒かかります。だから、時間をかけずに良い結果を得るために何を変えることができますか。私が使用する次のコード。変換ベクトルの時間の複雑さを減らす方法

public static Mat vect2mat(double[] array, int a) { 
Mat matrix = new Mat(a,(array.length+a-1)/a, CvType.CV_8UC1); 
int count = 0; 
for(int i=0; i<(array.length+a-1)/a; i++){ 
    for(int j=0; j<a; j++){ 
     matrix.put(j,i,array[count]); 
     count++; 
    } 
} 
return matrix; 

}

+0

は、このサンプルコードを試してみてください 'マットTMP =新しいマット(1、Array.lengthと、CvType.CV_8UC1)。 tmp.put(0,0、array); return tmp.reshape(1、a); '。 Javaコードをテストすることはできませんので、教えてください。私はそれが動作すれば回答として書く – Miki

答えて

0

以下は、このCODEがテストされていません(特に、配列インデックス)!!!

しかし、その考え方は、System.arraycopyを使用して、1次元配列の部分を2次元配列に素早くコピーすることです。 Matを配列に割り当てるのは、1つずつ配置するのではなく、1つのループを使って配列全体を同時に配置できるからです。あなたはおそらく配列から行列を作成し、再構築することができます

public static Mat vect2mat(double[] array, int a) { 
    Mat matrix = new Mat(a,(array.length+a-1)/a, CvType.CV_8UC1); 
    int count = 0; 
    double[][] matArray = new double[a][(array.length+a-1)/a]; 
    for(int i=0; i<(array.length+a-1)/a; i++){ 
     System.arraycopy(array, a*i, matArray[][i], 0, a); 
     matrix.put(a*i,i,array[][i]);//put the whole array 
    } 
    return matrix; 
} 
関連する問題