Мне нужно заполнить матрицу (хранящуюся как массив массивов) с некоторыми значениями. Матрица представляет собой якобиан для простой задачи диффузии и выглядит следующим образом:Вложенные «if» (AKA «switch») в Smalltalk (Pharo)
J(1,1) = 1, J(N,N)=0
и 1<n<N
:
J(n,n) = -2k/dx^2 - 2*c(n)
J(n,n-1)=J(n,n+1) = k/dx^2
остальные матрицы записи равны нулю.
До сих пор я это уродство:
(1 to: c size) collect: [ :n |
(1 to: c size) collect: [ :m |
n = 1 | (n = c size)
ifTrue: [ m = n ifTrue: [ 1.0 ] ifFalse: [ 0.0 ] ]
ifFalse: [ m = n
ifTrue: [ -2.0 * k/dx squared - (2.0 * (c at: n)) ]
ifFalse: [ m = (n-1) | (m = (n+1))
ifTrue: [ k/dx squared ]
ifFalse: [ 0.0 ] ] ]
] ]
Обратите внимание на вложенное "если-заявления" (Smalltalk эквиваленты). Это работает. Но, может быть, более элегантный способ сделать то же самое? Как сейчас, это довольно непроницаемо.
Для проблем, не связанных с игрушкой, вы можете использовать для этого более эффективную (разреженную) матричную реализацию. –
@StephanEggermont Конечно, для более серьезной задачи мне пришлось реализовать разреженную матрицу: скорость работы x2 - x3. – mobiuseng