Редукция двумерных массивов
В примерах везде, где функции применяются к матрице array=Matr, целочисленный двухкомпонентный вектор Num используется для хранения местоположения экстремума: Integer,dimension(1:2)::Num
Real,dimension(1:2,1:5) :: Matr
Таблица 39.
Вещественный массив для функций редукции двумерных массивов
1 2 3 4 5 Вещественный массив 1-11 –12. –13. –14. –15. (матрица Matr) 2-21 –22. –23. –24. 0. |
Говоря о матрицах, прежде всего, обсудим аргумент dim, и условимся говорить о суммировании, имея в виду, что для других операций редукции все делается аналогично. Для двумерного массива аргумент dim может отсутствовать или принимать значения из {1,2}:
- нетdim: возвращаемое значение – скаляр, сумма по всему массиву;
- dim =1: возвращаемое значение – вектор-строка, полученная в результате суммирования строками;
- dim =2: возвращаемое значение – вектор-столбец, полученный в результате суммирования столбцами.
Числовые функции заимствуют тип результата у массива array:
Value =Sum(array[, dim][,mask])! сумма
Value =Product(array[,dim][,mask])! произведение
Value =MinVal(array[,dim] [,mask])! минимум
Value =MaxVal(array[, dim][,mask])! максимум
Примеры
1. В матрице Matr найти минимум среди элементов, больших -20
Real S; S = MinVal(Matr, mask=Matr>-20)
Аргумент dim отсутствует. В результате число: S = -15.0
2. Найти max элементы в каждом столбце Matr(вектор-строка)
Real, dimension(1:5) S; S = MaxVal(Matr, dim=1)
В результате – вектор-строка: S(1:5)= [ –11., –12., –13., –14., 0. ]
3. Найти вектор-столбец с построчными суммами для элементов матрицы Matr, больших –22.5
Real,dimension(1:2)S;S=Sum(Matr,dim=2,mask=Matr>-22.5)
В результате – вектор-столбец: S(1)=– 11. – 12. – 13. – 14. – 15.,
S(2)=21. – 22. + 0. => S(1:2)= [ – 65., – 43. ]
4. Найти вектор-столбец с построчными произведениями для ненулевых элементов матрицы Matr с нечетными индексами столбцов.
Real, dimension(1:2) S
S=product(Matr(:,1:5:2),2,mask=Matr(:,1:5:2)/=0)
В результате – вектор-столбец: S(1) = (-11)*(-13)*(-15) = –2145.
S(2)=2 (-21)*(-23) = 483.
Логические функции для двумерного исходного массива возвращают логическое значение или одномерный массив:
any(mask[,dim])– результат «истина», если в массиве есть элементы со свойством mask, то есть логическое ИЛИ элементов маски;
all(mask[,dim])– результат «истина», если все элементы со свойством mask, то есть логическое И элементов маски.
АргументMaskзадают в виде логического выражения от числовой матрицы, в то время как самой числовой матрицы нет среди аргументов.
Примеры
1. Есть ли в матрице Matr элементы, по модулю превышающие 30?
Logical L; L=Any(abs(Matr)>30)
Аргумент dim отсутствует. Результат – скаляр, L = .FALSE.
2. По каждой строке матрицы Matr: есть ли элементы > (–1)?
Logical, dimension(1:2) L; L=Any(Matr>-1, dim=2)
Результат логический массив (вектор-столбец) L(1:2) =[.false.,.true. ]
3. О каждом столбце матрицы Matr: все ли элементы отрицательны?
Logical, dimension(1:5) L; L=All(Matr<0, dim=1)
Результат – логический массив (вектор-строка)
L(1:5)=[.true.,.true.,.true.,.true., .false. ]
Итоговый счетчик возвращает целое число или целочисленный массив – количество элементов, удовлетворяющих условию mask
Count(mask[,dim])
Примеры
1. Подсчитать количество отрицательных элементов в матрице Matr.
Integer K; K=Count(Matr<0)
Аргумент dimотсутствует. В результате – число K=9
2. Пересчитать отрицательные элементы каждой строки матрицы Matr
Integer,dimension(1:2)K; K= Count(Matr<0, dim=2)
Результат – целочисленный массив (вектор-столбец) K(1:2)= [5, 4]
Положение экстремума MinLoc MaxLoc
Функции возвращают целочисленный двухкомпонентный вектор с номером строки и столбца, где расположен экстремум.
Num = MaxLoc(array[,mask])! координаты максимума
Num = MinLoc(array[,mask]) ! координаты минимума
Примеры
1. Найти координаты максимального элемента массива Matr
Integer, dimension(1:2):: Num
Num = MaxLoc(Matr)
В результате: Num= [ 2, 5 ] для Matr(2,5) = 0.
2. Найти координаты максимального отрицательного элемента Matr
Integer, dimension(1:2):: Num
Num = MaxLoc(Matr, Matr<0)
В результате: Num = [ 1, 1 ] для Matr(1, 1) = –11.
3. Найти номер max по модулю элемента первой строки массива Matr
Integer, dimension(1:1):: Num
! поиск максимума в первой строке (одно измерение)
Num = MaxLoc(abs(Matr(1,1:5))); N = Num(1)
В результате: Num(1) = 5; N = 5 для Matr(1, 5) = –15.
4. Найти номер min элемента > (-20) в третьем столбце массива Matr
Integer, dimension(1:1):: Num
! поиск минимума в третьем столбце (одно измерение)
Num=MinLoc(Matr(1:2,3),Matr(1:2,3)>-20)); N=Num(1)
В результате: Num=[ 1 ]; N = 1 для Matr(1, 3) = –13.
Внимание: Фортран-95 определяет результат и при наличии аргумента dim, которого не было в Фортран-90.
Дата добавления: 2016-02-13; просмотров: 801;