Следующий ответ делает следующее предположение:
Оба Aij
и Lpq
имеют начальный и конечный индексы по умолчанию (т. Е. Начальные индексы равны ОДНО, а конечные индексы являются соответствующими измерениями).Т.е.
TYPE, DIMENSION(nA,nA,nB,nB) :: Aij
TYPE, DIMENSION(nA*nA,nB*nB) :: Lpq
Есть много способов отобразить Aij
на Lpq
, но вы определили, где второй и четвертый индексы в Aij
(обозначаемые m
и n
) - самые быстрые индексы в Lpq
. Это означает:
Aij(1,1 ,1,1) => Lpq(1,1)
...
Aij(1,nA ,1,1) => Lpq(nA,1)
Aij(2,1 ,1,1) => Lpq(nA+1,1)
...
Aij(2,nA ,1,1) => Lpq(2*nA,1)
...
Aij(nA,nA,1,1) => Lpq(nA*nA,1)
Аналогичное сопоставление существует для других измерений.
текущее преобразование, которое вы реализовали (т.е. p = k * nA + m
) устанавливает p=nA+1
, когда k=m=1
, и возвращает p=(nA+1)*nA
для k=m=nA
. Таким образом, вы пропускаете нижний диапазон и выходите за верхний диапазон.
вам нужноопределите сопоставление следующим образом:
p = (k-1) * nA + m
q = (l-1) * nB + n
Обратите внимание, однако, как уже упоминалось в комментариях, в Fortran есть встроенная процедура reshape
, которая может выполнять такие сопоставления для вас. К сожалению, в вашем конкретном случае этоне так удобно из-за выбора постовt index.
Если вы выберете самые быстрые индексы k
и l
, то вы можете использовать один reshape
, поскольку система уже находится в основной колонкепорядок:
Lpq = reshape(Aij,[nA*nA,nB*nB])
Если вы выбираете самые быстрые индексы m
и n
, то вам нужно два вызова на reshape
.Первый - поменять местами два индекса и привести систему в порядок столбцов, а второй - изменить форму.
Bij = reshape(Aij,[nA,nA,nB,nB],order=[2,1,4,3])
Lpq = reshape(Bij,[nA*nA,nB*nB])