Инициализировать двойной массив с ненулевыми значениями (blas) - PullRequest
6 голосов
/ 10 марта 2011

Я выделил большой двойной вектор, скажем, с элементом 100000.В какой-то момент в моем коде я хочу установить для всех элементов постоянное ненулевое значение.Как я могу сделать это без использования цикла for для всех элементов?Я также использую пакет blas, если это поможет.

Ответы [ 3 ]

9 голосов
/ 10 марта 2011

Вы можете использовать std::fill (#include <algorithm>):

std::fill(v.begin(), v.end(), 1);

Это, по сути, также только цикл, конечно ..

3 голосов
/ 10 марта 2011

'fill' является правильным из того, что вы сказали.

Помните, что также возможно создать вектор, полный указанного значения:

std::vector<double> vec(100000, 3.14);

Так что если "внекоторая точка означает «сразу после строительства», сделайте это вместо этого.Кроме того, это означает, что вы можете сделать это:

std::vector<double>(100000, 3.14).swap(vec);

, что может быть полезно, если «в какой-то момент» означает «сразу после изменения размера», и вы ожидаете / хотите, чтобы вектор был перераспределен («ожидаем«если вы делаете его больше, чем его предыдущая емкость,« хотите », если вы делаете его намного меньше и хотите, чтобы он был обрезан для экономии памяти).

0 голосов
/ 10 марта 2011

Вы всегда используете memset(), если не хотите зацикливаться.

То есть memset(myarr, 5, arrsize);, чтобы заполнить его всеми 5-ю. Остерегайтесь неявного преобразования в unsigned char.

СИНТАКСИС

 #include <string.h>

 void *
 memset(void *b, int c, size_t len);

ОПИСАНИЕ

 The memset() function writes len bytes of value c (converted to an
 unsigned char) to the byte string b.

А если вектор большой, и вам нужно, чтобы он шел быстро, и вы используете gcc, то:

Генерация кода перемещения блока (memcpy) и набор блоков (memset) был переписан. GCC теперь может выбрать лучший алгоритм (цикл, развернутый цикл, инструкция с повтор префикса или вызов библиотеки) на основе размер копируемого блока и процессор оптимизирован для.

...