我正在尝试解决strassen算法的奇数矩阵问题。我的实现在某一点截断递归,称之为Q,并切换到标准实现。因此,在进行静态填充时,实际上我不需要填充到2的下一个幂。我只需要填充到比输入矩阵维度大至少m * 2 ^ k,使得m <1。 Q值。
我在实现这个方面遇到了一些麻烦 - 主要是因为我不确定什么是最有效的。我是否需要遍历所有可能的m值,或者我是否从每个给定的输入增加,测试它们是否符合标准?
答案 0 :(得分:0)
你是对的。填充高达m * 2 ^ k应该比填充到下一次2的幂要好得多。
我认为你应该填补这个函数计算的值:
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);
}
}
答案 1 :(得分:0)
使用以上作为灵感,我相信找到了一个更简洁的算法来找到最小填充
它的工作原理是重复地将数字除以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;
}