Jest to nieco skomplikowane; Z zadowoleniem przyjmuję wszelkie uwagi dotyczące poprawy jasności pytania.Przydzielanie dynamicznej macierzy o współzależnych wymiarach
Ok, powiedzmy Mam tablicę:
real, allocatable :: A(:,:,:)
i chcę przeznaczyć go zanim go używać. Czy rozmiar trzeciego wymiaru może zależeć od rozmiaru drugiego wymiaru?
E.g.
do i=1,n
allocate(A(3,i,i**2))
end do
Oczywiście powyższe nie działa. Chciałbym koniec z tablicy (albo zestaw matryc) o kształcie (a)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
gdzie wielkość trzeci wymiar kwadratu o wielkości na drugim wymiarze.
Moja zasada wielkości wymiaru zależnego jest nieco bardziej skomplikowana, ale jeśli kwadratura jest możliwa, mogę zrobić resztę.
Czy to możliwe? Jeśli tak, jak mogę go wdrożyć w Fortranie?
Co powróci shape(A)
? To byłoby interesujące.
Moja druga alternatywa jest przyznanie się do maksymalnej wielkości wymaganej, i uważać, aby stosować tylko niektóre elementy w obliczeniach, tj
allocate(A(3,n,n**2))
Choć nie jestem ciężko się na pamięć w tej chwili, ja chciałby mieć dobre praktyki programistyczne. To i tak interesujący problem.
Dziękuję.
EDIT:
Co mający rozmiar wymiar zależy od wartości elementu w innym wymiarze ?
W odpowiedzi poniżej rozmiaru tablicy w obu wymiarach zależy od indeksu B. Chciałbym coś wzdłuż linii
type myarray
real :: coord(3)
integer,allocatable :: lev(:)
integer, allocatable :: cell(:)
endtype myarray
type(myarray), allocatable :: data
allocate(data(m))
allocate(data%lev(n))
forall (j=1:n) !simple now, for argument's sake
lev(j)=j
endforall
! I was thinking of using a FORALL loop here, but the errors returned
! suggested that the compiler (gfortran) didn't expect IF blocks and ALLOCATE
! statements in a FORALL block
do i=1,m
do j=1,n
allocate(data(i)%cell(lev(j)**2))
enddo
enddo
Ci co mam na myśli? Ale program przewraca się, ponieważ próbuje przydzielić już przydzielone zmienne, np. gdy i=1
przydziela data(1)%cell(1)
, a następnie próbuje przydzielić data(1)%cell(2)
... uh oh. Co chcę jest coś takiego:
Każdy data(i)
ma tablicę lev(j)
wartości, z j
biegnący od 1 do n, a dla każdej wartości lev(j)
mamy cell
wielkości lev
^2. Zauważ, że te cell
są unikatowe dla każdego data(i)
i każdego lev
i że rozmiar tego konkretnego cell
zależy od odpowiedniej wartości lev
i ewentualnie odpowiadającego data(i)
.
Czy musiałbym używać typu pochodnego w typie pochodnym?
tak wiesz, Typ poszukiwanej macierzy nazywa się tablicą "postrzępioną", a nie tablicą "prostokątną". IRO-bot poniżej ma poprawną odpowiedź; w tablicach Fortranu same są zawsze prostokątne, ale można użyć zdefiniowanych typów do stworzenia własnej struktury. –
"Jagged" ... hej, to ma sens, obrazowo. "... możesz użyć zdefiniowanych typów, aby stworzyć własną strukturę." Naprawdę? Więc jeśli chcę tablicy, której kształt wzrasta do połowy, a następnie maleje, lub podąża za sekwencją Fibonacciego, lub jest całkowicie losowy - to wszystko jest możliwe bez zbytniego wysiłku ... fajnie! –
@SamuelTan Dalej edytowałem swoją odpowiedź z zaktualizowanym kodem, aby rozwiązać twój nowy problem. Porównaj dwa kody, aby zobaczyć, co robiłeś źle. – milancurcic