Редукция одномерных массивов
Все ответы в примерах, приведенных ниже, получены для одномерного вещественного массива:
Real,dimension(1:7)::Ar
Таблица 38.Вещественный массив для редукции одномерных массивов
Массив Ar=[ 2.1, -0.7, 0.0, 17., -12., 0.4, -35.5] Номера элементов 1 2 3 4 5 6 7 |
Итоговые функции с редукцией массивов Sum, Product, MinVal, MaxVal
Здесь и далее в описаниях функций аргументы, указанные в квадратных скобках, необязательны (могут отсутствовать при конкретном вызове). Так, для одномерного массива аргумент №2 dim можно опускать или указывать dim=1 –для одномерного массива результат редукции – всегда скаляр, как итог по всему массиву. Аргумент dim почти во всех примерах отсутствует, поскольку для одномерного массива он не влияет на форму результата. Итоговые числовые функции перенимают тип у массива:
Real,dimension(1:5):: Ar;RealValue
Value =Sum(array[, dim][,mask])! сумма
Value =Product(array[,dim][,mask])! произведение
Value =MinVal(array[,dim] [,mask])! минимум
Value =MaxVal(array[, dim][,mask])! максимум
Примеры
1. Найти значение минимального положительного элемента массива Ar
Real Zmin
Два варианта задания аргументов при вызове функции MinVal:
Zmin=MinVal(Ar,1,Ar>0) – имена аргументов не пишут, поскольку все они указаны по порядку на своих местах;
Zmin=MinVal(Ar,mask=Ar>0) – пропущен аргумент №2 dim и из-за этого необходимо указать имя mask для аргумента №3, этого будем придерживаться в последующих примерах для одномерного массива.
В результате: Zmin = 0.4
2. Найти значение максимального элемента Ar из интервала [0.1, 17.6]
Real Zmax; Zmax=MaxVal(Ar, mask=0.1<=Ar.and.Ar<=17.6)
В результате: Zmax = 17.0
3. Найти сумму квадратов положительных элементов секции Ar(1:7:3)
Real SumQu; SumQu=Sum(Ar(1:7:3)**2, mask=Ar(1:7:3)>0)
В результате: SumQu = Ar(1)2 + Ar(4)2 = 2.12 + 172 = 293.41
4. Найти произведение модулей ненулевых элементов секции Ar(3:7)
Real Prod; Prod=Product(abs(Ar(3:7)),mask=Ar(3:7)/=0)
В результате:
Prod = Ar(4) * Ar(5) * Ar(6)* Ar(7) = 17.0*12.0*0.4*35.5 = 2896.8
Внимание, типичная ошибка, когда, используя секцию массива, забывают эту секцию указать для маски Mask, и тогда size(Array)≠size(Mask) :
- ошибка, которая выявится при компиляции
Su=Sum(Array =Ar(1:3),mask=Ar>0)
– Su=Sum(Array=Ar(1:N), mask=Ar>0)- нет ошибок при компиляции
- при N=7 ошибки действительно нет
- при неизвестном N<7 ошибка есть
- правильно так:Su=Sum(Array =Ar(1:N), mask=Ar(1:N)>0)
Any, all– итоговые логические функции с редукцией формы массива
Итоговые логические функции возвращают логическое значение:
Any(mask)– результат «true», если в массиве есть элементы со свойством mask; иначе говоря, это логическое ИЛИ элементов маски;
All(mask)– результат «true», если все элементы массива обладают свойством mask; иначе говоря, это логическое И элементов маски.
Примеры
1. Есть ли в массиве Ar элементы, по модулю большие 30 ?
Logical L1; L1=Any(abs(Ar)>30)
В результате: L1 = .true. так как|-35.5|>30
Другой пример
if(Any(abs(Ar)>30))print *,’ Ar > 30 presents’
2. Все ли элементы с пятого по седьмой отрицательны?
Logical L2
L2 = All(Ar(5:7)<0) ! В результате: L2=.false.
Другой пример:
if(.not.All(Ar(5:7)<0))print *,’not all Аr(5:7)< 0’
Итоговый счетчик Count
Возвращается целое число – количество элементов, со свойством mask
int=count(mask)– сколько элементов удовлетворяет mask.
Пример
Найти количество элементов массива Аr, по модулю больших 11.
Integer K11; K11 = Count(abs(Ar)>11)
В результате: K11=3 – три элемента: |Ar(4)|>11, |Ar(5)|>11, |Ar(7)|>11
Внимание:
- аргументMaskзадают в виде логического выражения от числового массива, в то время как самого числового массива нет среди аргументов функций all, any, count;
- аргумент dim почти во всех примерах отсутствует, поскольку для одномерного массива он не влияет на форму результата.
Положение экстремума – MaxLoc MinLoc
Функции MaxLoc, MinLoc этой группы являются справочными и не редуцируют исходный массив.
Integer,dimension(1:1):: Num
Num=MaxLoc(array[,mask])! Num(1)- номер максимального элемента
Num=MinLoc(array[,mask])! Num(1)-номер минимального элемента
Для одномерного массива функции MaxLoc, MinLoc возвращают целочисленный однокомпонентный вектор с номером минимального (MinLoc) или максимального (MaxLoc) элемента для массива Array = Ar.
Примеры
1. Найти номер максимального элемента одномерного массива Ar.
Integer,dimension(1:1):: Num; IntegerN
Num=MaxLoc(Ar); N = Num(1)
Можно к однокомпонентному вектору MaxLoc(Ar) применить любую из четырех числовых функций редукции, тогда получим скаляр: N=Sum(MaxLoc(Ar))
В результате: N = 4 – для максимального элемента Ar(4) = 17.0
2. Найти номер минимального положительного элемента массиваAr.
Integer,dimension(1:1)::Num; IntegerN
Num=MinLoc(Ar,mask=Ar>0); N=Num(1)
или N=Sum(MinLoc(Ar,mask=Ar>0))
или N=Sum(MinLoc(Ar,1,Ar>0))
В результате: N=6 для минимального положительного элемента Ar(6)=0.4
Дата добавления: 2016-02-13; просмотров: 1038;