Ответ Владимира Ф говорит о важной части: для (i,j)
быть сложной константой константы i
и j
должны быть константами. Как указано там, внутренняя комплексная функция cmplx
может использоваться в более общих случаях.
В целях разнообразия и предоставления опций я рассмотрю другие аспекты сложных массивов. В следующих примерах я проигнорирую выводную инструкцию и предполагаю данные.
У нас есть, то коррекция Владимира F в:
do i=1,3
do j=1,3
indx(i,j) = CMPLX(i,j) ! Note that this isn't in array element order
end do
end do
Мы могли бы отметить, однако, что cmplx
является элементный функция:
do i=1,3
indx(i,:) = CMPLX(i,[(j,j=1,3)])
end do
Кроме того, мы можем рассмотреть
indx = RESHAPE(CMPLX([((i,i=1,3),j=1,3)],[((j,i=1,3),j=1,3)]),[3,3])
, где на этот раз t его правая сторона находится в порядке элемента массива для indx
.
Ну, я, конечно, не буду говорить, что этот последний (или, возможно, даже второй) лучше, чем исходный цикл, но это вариант. В некоторых случаях это может быть более элегантным.
Но у нас еще есть другие возможности. Если один поддерживает компилятор для сложных деталей десигнаторов мы имеем альтернативу для первой формы:
do i=1,3
do j=1,3
indx(i,j)%re = i
indx(i,j)%im = j
end do
end do
Это на самом деле не дает нам ничего, но обратите внимание, что мы можем иметь сложную часть массива:
do i=1,3
indx(i,:)%re = [(i,j=1,3)]
indx(i,:)%im = [(j,j=1,3)]
end do
или
do i=1,3
indx(i,:)%re = i ! Using scalar to array assignment
indx(i,:)%im = [(j,j=1,3)]
end do
И мы могли бы пройти весь путь к
indx%re = RESHAPE([((i,i=1,3),j=1,3))],[3,3])
indx%im = RESHAPE([((j,i=1,3),j=1,3))],[3,3])
Опять же, все это во имя разнообразия или для других приложений. В некоторых из них есть даже spread
. Но не ненавидите человека, просматривающего ваш код.
Это constants not constant expresssions.