2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Присвоение элементов массива в Fortran
Сообщение06.03.2019, 09:16 
Например, есть массив из 10 элементов, нужно присвоить новые значения нечетным элементам и последнему.
Как это сделать в одну строчку? Не могу найти информацию в ISO Fortran 2018.

Понятно как сделать в две строки:
Используется синтаксис Fortran
program test
    implicit none
    integer, dimension(10) :: arr

    arr = 0
    arr(1:10:2) = 1
    arr(10) = 1
    write(*,*) arr

end program test
 


В одну можно сделать так:
Используется синтаксис Fortran
program test
    implicit none
    integer, dimension(10) :: arr

    arr = 0
    arr([1,3,5,7,9,10]) = 1
    write(*,*) arr

end program test
 


Но приходится явно писать все элементы.
Можно ли использовать форму a:b:c и как то получить результат в одну строчку?

 
 
 
 Re: Присвоение элементов массива в Fortran
Сообщение06.03.2019, 11:28 
Аватара пользователя
Странное пожелание. А чем вас первый способ не устраивает?

 
 
 
 Re: Присвоение элементов массива в Fortran
Сообщение06.03.2019, 11:44 
Обойтись только вырезками не получится, но исхитриться можно. Например, так: arr([(/(i,i=1,9,2)/),10]) = 1 . Целочисленную переменную i, правда, придется объявить.

 
 
 
 Re: Присвоение элементов массива в Fortran
Сообщение07.03.2019, 05:42 
Munin в сообщении #1380097 писал(а):
Странное пожелание. А чем вас первый способ не устраивает?

В принципе, первый способ нормальный, но для него нужно переписывать программу. Сейчас автоматически генерируется второй вариант. Он получается из выражений вида $(x_1,x_2,\dots) = (f_1(x),f_2(x),...)$ после удаления единиц $f_i(x) = x_i$. Пока просто хочется улучшить его читаемость. Может их и не нужно удалять и компилятор сам позаботится о такой оптимизации?

Pphantom в сообщении #1380100 писал(а):
Обойтись только вырезками не получится, но исхитриться можно. Например, так: arr([(/(i,i=1,9,2)/),10]) = 1 . Целочисленную переменную i, правда, придется объявить.

Интересное решение, спасибо.

 
 
 
 Re: Присвоение элементов массива в Fortran
Сообщение30.04.2019, 17:29 
Аватара пользователя
В современном стиле можно так написать. Хотя это не в одну строчку и с переменной i. Зато синтаксис крайне понятный. Или можно через forall, но он, в данном случае, по сути повторяет ваш 1-й вариант (закомментировал эту строчку).


код: [ скачать ] [ спрятать ]
Используется синтаксис Fortran
program test

implicit none
integer, dimension(10) :: arr
integer :: i

arr = 0

        do concurrent (i = 1:10:2)
                arr (i)  = 1
                arr (10) = 1  
        end do

        !forall (i=1:10:2) arr(i) = 1; arr(10) = 1

write(*,*) arr
end program test

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group