In GNU Octave questo codice -Haskell repa - come ridurre l'array e l'indice di ritorno?
[e, ix] = min(X);
tornerà elemento minimo e la sua posizione. Come si fa in questo repa per la funzione binaria arbitraria?
Questo è quello che si avvicinò con:
min x = z $ foldl' f (e,0,0) es
where
(e:es) = toList x
f (a,ix,r) b = let ix' = ix+1 in if a < b then (a,ix',r) else (b,ix',ix')
z (a,ix,r) = (a,r)
Nell'esempio sopra convertire repa matrice 1D elencare e utilizzare foldl'(da Data.List) con due accumulatori - uno per il conteggio iterazioni (ix) e altro per salvare la posizione dell'elemento min (r). Ma l'intero punto di utilizzo di repa è usare matrici, non liste!
In repa ci sono due pieghe per tipo Array (foldS e foldP) - ma possono solo prendere la funzione di tipo (a -> a -> a) - cioè, non posso passare tupla con accumulatori ad esso. C'è anche traversata, che può, in linea di principio, a ridurre serie 1D a un array scalare:
min x = traverse x to0D min
where
to0D (Z:.i) = Z
min f (Z) = ??? -- how to get elements for comparison?
La prima cosa che viene in mente è
[f (Z:.i) | i <- [1..n]], where n = (\(Z:.i) -> i) $ extent x
ma questo sarà anche convertire allineamento alla lista, invece di fare calcoli sull'array.
Non hai familiarità con repa, ma non puoi semplicemente mappare ogni elemento in una tupla prima di usare 'foldP?'. Ad esempio, è possibile descrivere un sottoarray usando una tupla dell'elemento minimo, l'indice del minimo e la lunghezza del sottoarray. Quindi mappate ogni elemento 'x' a' (x, 0, 1) 'e quindi piegate parallelamente usando' f (x, i, n) (y, j, m) = se x
hammar
Siamo spiacenti, questo dovrebbe essere "maxBound". – hammar
Per usare foldP con una tupla dovrai avere array con quelle tuple. Può essere fatto, ma questo è uno spreco per l'elaborazione delle immagini (milioni di elementi). – EvgenijM86