|
Программирование >> Операторы преобразования типа
Если рассматривать массив значений как двухмерную матрицу, этот пример представляет собой не что иное, как умножение векторов (рис. 12,1). Однако следует учитывать, что порядок выполнения отдельных присваиваний не определен. Следовательно, если приемное подмножество содержит элементы, используемые в исходном подмножестве, последствия могут быть непредсказуемыми.
va[slice(0,4,3)] = va[slice(1,4,3)] * va[slice(2.4,3)] Рис. 12.1. Умножение векторов с использованием срезов Также возможны и более сложные команды. Например: va[std::sl1ce(0.100,3)] = std::pow(VA(va[std::slice(l.100.3)]) * 5.0. VA(va[std:;slice(2.100.3)])); Еще раз обратите внимание: отдельное значение (5.0 в данном случае) должно точно соответствовать типу элементов массива значений. Следующая программа представляет собой полноценный пример использования срезов: num/slicel.cpp #lnclude <1ostreafTi> #1nclude <valarray> using namespace std; Вывод массива значений no строкам tempiate<class T> void printValarray (const valarray<T>& va. int num) for (Int 1=0: i<va.s1ze()/num: ++1) { for (Int j=0; j<num; ++j) { cout va[1*num+j] ; cout endl; cout endl; Int mainO /* Массив значений с 12 элементами * - четыре строки * - три столбца valarray<clouble> va(12); Заполнение массива данными for (int i=0: 1<12: i++) ( va[1] - 1: printValarray (va. 3): первый столбец = второй столбец. возведенный в степень третьего столбца va[sl1ce(0.4.3)] = pow (valarray<double>Cva[slice(1.4.3)]). valarray<double>(va[sl1се(2.4.3)1)): prIntValarray (va. 3): Создание массива значений valarray с троекратным повторением третьего злемента va valarray<double> vb(va[sl1ce(2.4.0)]); Умножение третьего столбца на элементы vb va[sl1ce(2.4.3)] *= vb: pnntValarray (va, 3); Вывод квадратных корней из элементов второй строки printValarray (sqrt(valarray<dQable>(va[s11ce(3.3,l)])). 3); Удвоение элементов третьей строки va[sllce(2.4.3)] = valarray<double>(va[sl1ce(2.4,3)]) * 2.0: printValarray (va. 3): Результат выполнения программы выглядит так: 0 1 2 3 4 5 6 7 8 9 10 11 1 1 2 1024 4 5 5.7648У+006 7 8 1е+011 10 11 1 1 4 1024 4 10 5.7648У+006 7 16 1е+011 10 гг 32 2 3.16228 118 1024 4 20 5.7648У+006 7 32 1е+011 10 44 Обобщенные срезы По аналогии со срезами, определяющими подмножество элементов из одного измерения двухмерного массива, обобщенные срезы предназначены для обработки подмножеств элементов многомерных массивов. Вообще говоря, обобщенные срезы характеризуются теми же свойствами, что и обычные срезы: О начальным индексом; О количеством элементов (размером); О расстоянием между элементами (шагом). Однако в отличие от обычных срезов количество и расстояния между элементами в обобщенных срезах определяются массивами. Ко.яичество элементов в таких массивах эквивалентно размерности. Например, обобщенный срез со следующим состоянием эквивалентен обычному срезу, поскольку массив имеет всего одно измерение: Начальный индекс: 2 Размер: [ 4 ] Шаг: [ 3 ] Иначе говоря, обобщенный срез определяет четыре элемента на расстоянии 3, начинающихся с индекса 2: 2 5 В 11 Однако обобщенный срез с представленным ниже состоянием фактически создает двухмерный массив: Начальный индекс: 2 Размер: [24] Шаг: [ 10 3 ] Срез определяет две серии из четырех элементов на расстоянии 3, начиная с индекса 2, разделенных расстоянием 10: 2 5 а И 12 15 18 21 Пример среза с тремя измерениями: Начальный индекс: 2 Размер: [ 3 2 4 ] Шаг: [ 30 10 3 ] Срез содержит следзтощие серии э.яементов: 2 5 8 11 12 15 18 21
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |