2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Присвоение элементов массива в Fortran
Сообщение06.03.2019, 09:16 


08/03/11
186
Например, есть массив из 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 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Странное пожелание. А чем вас первый способ не устраивает?

 Профиль  
                  
 
 Re: Присвоение элементов массива в Fortran
Сообщение06.03.2019, 11:44 
Заслуженный участник


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

 Профиль  
                  
 
 Re: Присвоение элементов массива в Fortran
Сообщение07.03.2019, 05:42 


08/03/11
186
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 
Аватара пользователя


30/04/19
235
В современном стиле можно так написать. Хотя это не в одну строчку и с переменной 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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group