Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
94
Добавлен:
14.04.2015
Размер:
3.38 Mб
Скачать

Редукция одномерных массивов

Все ответы в примерах, приведенных ниже, получены для одномерного вещественного массива:

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

Здесь и далее в описаниях функций аргументы, указанные в квадратных скобках, необязательны(могут отсутствовать при конкретном вызове). Так, для одномерного массива аргумент №2dimможно опускать или указыватьdim=1 –для одномерного массива результат редукции – всегда скаляр, как итог по всему массиву. Аргумент dimпочти во всех примерах отсутствует, поскольку для одномерного массива он не влияет на форму результата. Итоговые числовые функцииперенимают тип у массива:

Real,dimension(1:5):: Ar; Real Value

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) – пропущен аргумент №2dim и из-за этого необходимо указать имяmaskдля аргумента №3, этого будем придерживаться в последующих примерах для одномерного массива.

В результате: Zmin= 0.4

  1. Найти значение максимального элемента Arиз интервала [0.1, 17.6]

Real Zmax; Zmax=MaxVal(Ar, mask=0.1<=Ar.and.Ar<=17.6)

В результате: Zmax = 17.0

  1. Найти сумму квадратов положительных элементов секции 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

  1. Найти произведение модулей ненулевых элементов секции 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’

  1. Все ли элементы с пятого по седьмой отрицательны?

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почти во всех примерах отсутствует, поскольку для одномерного массива он не влияет на форму результата.

Положение экстремумаMaxLocMinLoc

Функции 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; Integer N

Num=MaxLoc(Ar); N = Num(1)

Можно к однокомпонентному вектору MaxLoc(Ar)применить любую из четырехчисловых функций редукции, тогда получим скаляр:N=Sum(MaxLoc(Ar))

В результате: N= 4 – для максимального элементаAr(4) = 17.0

  1. Найти номер минимального положительного элемента массива Ar.

Integer,dimension(1:1)::Num; Integer N

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

Соседние файлы в папке Фортран_Лекции