2010-12-07 2 views
5

Основной вопрос: У меня есть квадрат размера. У меня есть вектор верхних и нижних границ. Каков наиболее эффективный способ перечислить координаты вершин?Каков наиболее эффективный способ перечисления вершин k-мерного гиперкуба в C++?

Предпосылки: Например, у меня есть трехмерная коробка. Самый эффективный алгоритм/код для получения:

vertex[0] = (0, 0, 0) -> (L_0, L_1, L_2) 
vertex[1] = (0, 0, 1) -> (L_0, L_1, U_2) 
vertex[2] = (0, 1, 0) -> (L_0, U_1, L_2) 
vertex[3] = (0, 1, 1) -> (L_0, U_1, U_2) 

vertex[4] = (1, 0, 0) -> (U_0, L_1, L_2) 
vertex[5] = (1, 0, 1) -> (U_0, L_1, U_2) 
vertex[6] = (1, 1, 0) -> (U_0, U_1, L_2) 
vertex[7] = (1, 1, 1) -> (U_0, U_1, U_2) 

где L_0 соответствует 0'th элемента нижней границы вектора & также U_2 является вторым элементом верхней границы вектора.

Мой код:

const unsigned int nVertices = ((unsigned int)(floor(std::pow(2.0, double(nDimensions))))); 

for (unsigned int idx=0; idx < nVertices; ++idx) 
{ 
    for (unsigned int k=0; k < nDimensions; ++k) 
    { 
     if (0x00000001 & (idx >> k)) 
     { 
     bound[idx][k] = upperBound[k]; 
     } 
     else 
     { 
     bound[idx][k] = lowerBound[k]; 
     } 
    } 
} 

где переменная bound объявлена ​​как:

std::vector< std::vector<double> > bound(nVertices); 

но у меня до размера так, чтобы не тратить время на выделение памяти петли , Мне нужно вызывать описанную выше процедуру около 50 000 000 раз каждый раз, когда я запускаю свой алгоритм, поэтому мне нужно, чтобы это было действительно эффективно.

Возможные подзаголовки: Быстрее ли сдвигается на k вместо того, чтобы всегда переключаться на 1 и сохранять промежуточный результат? (Должен ли я использовать >> = ??)

+0

Как вы могли бы прошу прощения в ассемблере? И еще одна вещь: Профиль, Профиль, Профиль. Примите предложения здесь и проверьте, чтобы узнать, где они находятся, и где они медленны. – 2010-12-07 03:56:31

+0

Насколько велика k? Это исправлено? – 2010-12-07 03:57:29

ответ

4

Это, вероятно, быстрее, если вы можете уменьшить условное ветвление:

bound[idx][k] = upperLowerBounds[(idx >> k) & 1][k]; 

Вы могли бы улучшить положение вещей еще больше, если вы можете чередовать верхние и нижние границы в один массив:

bound[idx][k] = upperLowerBounds[(k << 1) | (idx >> k)&1]; 

Я не знаю, если смещение idx пошагово помогает. Это достаточно просто для реализации, поэтому стоит попробовать.

 Смежные вопросы

  • Нет связанных вопросов^_^