2012-03-28 2 views
3

私はstrassenのアルゴリズムのための奇数行列の問題に取り組もうとしています。私の実装はある時点で再帰を切り捨て、Qと呼んで標準実装に切り替えます。したがって、静的なパディングを行う際には、実際には2の次のべき乗までパディングする必要はありません。入力行列の次元よりも最小のm * 2^kまでパッドする必要があります。strassenの奇数行列のための最適化された静的な埋め込み

これを実装する際に問題が発生しています。これは、主に効率的なものがわからないためです。可能なすべてのm値をループする必要がありますか、またはそれぞれの入力からインクリメントして基準を満たしているかどうかをテストしますか?

答えて

0

あなたは正しいですか?インスピレーションとして

上記を使用して
int get_best_pud_up_value(int actual_size, int Q) { 
    int cnt = 0; 
    int n = actual_size; 
    while(n > Q) { 
     cnt++; 
     n /= 2; 
    } 

    // result should be smallest value such that: 
    // result >= actual_size AND 
    // result % (1<<cnt) == 0 

    if (actual_size % (1<<cnt) == 0) { 
     return actual_size; 
    } else { 
     return actual_size + (1<<cnt) - actual_size % (1<<cnt); 
    } 
} 
+0

actual_size = 258、Q = 17の場合、これは256を返していますが、これは間違っていると思います。私はそれを272に詰めたかったでしょう。この問題は、2で割って奇数を得るときですが、しきい値に達する前です。 –

+0

あなたは正しいです。私の以前の解決策は間違っていた。私はそれを修正しました。今度はactual_size = 258、Q = 17の戻り値は272です。 –

0

:パディングメートルまで* 2^kが、私はあなたが値までパッドは、この関数によって計算すべきだと思う2.

次のパワーまでパディングするよりもはるかに良いを実行する必要があります私は、最小パディングを見つけるためのより簡潔なアルゴリズムを見つけたと信じています

これは、しきい値を下回るまで2を割り切れるように繰り返して動作し、次に2 **カウンタを掛けてサイズを求めますしきい値よりも小さくなるまで2で割り切れるようにするには、パッドを埋めなければならない。

unsigned int minPad(unsigned int inSize, unsigned int threshold) { 
    unsigned int counter = 0; 
    while (inSize > threshold) { 
     inSize++; 
     inSize >>= 1; 
     counter ++; 
    } 
    return inSize << counter; 
} 
+0

inSize ++はif(inSize%2)inSize ++に置き換えることができます。しかし、偶数+ 1の整数除算/ 2はそれ自体に等しいので、常に1を加えることは無害です –

関連する問題