Sto implementando un determinato algoritmo che funziona in questo modo:
- Crea un contorno chiuso (elenco) di elementi in una matrice, dove chiuso significa che l'ultimo elemento è adiacente (per riga, colonna) al primo.
- Peso (moltiplica) ciascuno degli elementi indirizzati dal contorno da uno scalare associato alla posizione dell'elemento nella matrice (cioè, cercare in una matrice (sparsa) di dimensione uguale), tranne
- Se l'elemento successivo nel contorno ha un peso diverso, reimposta entrambi gli elementi con una (media) riduzione del peso dei due elementi.
- Somma gli elementi ponderati.
Se voglio mantenere questo generale, vedo due modi per farlo:
- Mentre creo il contorno, controlla se l'elemento successivo nel contorno ha un peso associato diverso e contrassegnalo in un altro elenco / dettato per l'elaborazione in 2.1 o
- Calcola la prima differenza in tutte e quattro le direzioni (caso matrice 2D) per l'intera matrice, e cerca la differenza in base alla direzione del contorno (in termini di elementi) in quel punto.
Alcuni problemi con l'approccio (1) sono; che ogni passo nella costruzione del contorno deve guardare uno dei valori usati nel passaggio successivo, e mescola anche le responsabilità (è possibile ovviare con passaggi multipli di iterazione nel codice). Calcola solo i dati necessari per il lavoro.
D'altra parte, l'approccio (2) crea quattro copie della matrice, che potrebbe essere enorme. Però è molto più facile da programmare.
Sono propenso all'approccio (1), ma vorrei sapere se (2) potrebbe effettivamente essere più efficiente, o se c'è un altro approccio che non ho considerato.