這有點複雜;對於如何提高問題的清晰度,我歡迎任何意見。分配具有相互依賴維度的動態數組
好吧,說我有一個數組:
real, allocatable :: A(:,:,:)
,我想之前我用它來分配它。第三維的大小是否可能取決於第二維的大小?
E.g.
do i=1,n
allocate(A(3,i,i**2))
end do
顯然上述不起作用。我想要的陣列(或一組陣列)與形狀(多個)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
其中第三維度的大小是所述第二尺寸的大小的平方來結束。
我的規則對於依賴維度的大小稍微複雜一點,但是如果可以進行平方,我可以完成剩下的工作。
這可能嗎?如果是這樣,我如何在Fortran中實現它?
shape(A)
會返回什麼?這很有趣。
我的另一種方法是分配所需的最大容量,並小心地只在計算中使用的某些元素,即
allocate(A(3,n,n**2))
即使我沒有硬起來記憶的那一刻,我我想要有良好的編程習慣。無論如何,這是一個有趣的問題。
謝謝。
編輯:
關於具有維度的大小取決於值在另一個維度中的元素的什麼?
在陣列的兩個維度的尺寸下面的答案取決於B.我的指數想沿着
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
你得到的東西線是什麼意思?但是,當程序試圖分配已經分配的變量時,程序就會失敗。當i=1
它分配data(1)%cell(1)
,然後試圖分配data(1)%cell(2)
......呃哦。我想是這樣的:
每個data(i)
有值的數組lev(j)
,與j
從1到n,併爲每個lev(j)
價值,我們有大小lev
^2的cell
。請注意,這些cell
對於每個data(i)
和每個lev
都是唯一的,並且該特定cell
的大小取決於對應的lev
值,並且可能也取決於對應的data(i)
。
我必須在派生類型中使用派生類型嗎?
只要你知道,你正在尋找的數組類型稱爲「鋸齒狀」數組,就像「矩形」數組一樣。下面的IRO-bot有正確答案;在Fortran中,數組本身總是矩形的,但您可以使用定義的類型來創建自己的結構。 – 2011-12-19 13:54:56
「鐵血」......嘿,這很有道理,畫像。 「...您可以使用定義的類型來創建自己的結構。」真?所以如果我想要一個數組的形狀一直增加到一半然後減少,或者遵循斐波那契數列,或者完全是隨機的,那麼所有這些都可能不需要太多的努力......很酷! – 2011-12-20 00:17:32
@SamuelTan我用更新後的代碼進一步編輯了我的答案,以解決您的新問題。比較兩個代碼,看看你做錯了什麼。 – milancurcic 2011-12-20 04:53:57