2014-09-14 12 views
5

Problema: A è quadrato, a pieno rango, sparse e a bande. Ha troppi elementi da memorizzare come una singola matrice in Matlab (almeno ~ 4.6 * 10 e idealmente ~ 10 , entrambi superano lo max array size. MODIFICA: A è memorizzato come sparse, e il problema non è con memoria limitata ma con un numero limitato di elementi). Pertanto devo memorizzarlo come una raccolta di array più piccoli (righe/diagonali/colonne/blocchi).Risolvere Ax = b dove A è troppo grande per essere memorizzato in un singolo array

In cerca di: un modo per risolvere Ax = b, con A dato come raccolta di array più piccoli. Idealmente in Matlab, ma non è un must.
In alternativa, se non in Matlab: forse c'è un programma in grado di archiviare e risolvere una A così grande?

Trovato finora: metodi se A è tri/pentadiagonale, ma il mio A ha N diagonali. Ho anche trovato qualcosa sul partizionamento A sui blocchi, ma non sono riuscito a trovare un modo per risolvere un sistema lineare con questi blocchi.

p.s. Il sistema è a 64 bit.

Grazie a tutti!

+2

Hai definito la matrice come una matrice normale? Non esplicitamente come [** sparse **] (http://www.mathworks.de/de/help/matlab/ref/sparse.html)? Quest'ultimo dovrebbe farti risparmiare molta memoria. Per risolvere: [** questo articolo **] (http://www.mathworks.de/de/help/matlab/math/sparse-matrix-operations.html) è probabilmente utile. Non ho mai usato matrici sparse e non posso aiutarti ulteriormente, ma sicuramente altri possono;) – thewaywewalk

+0

'sparse' ha anche limiti di dimensione. Controlla il secondo argomento di output di 'computer', restituisce il numero massimo di elementi che possono essere indicizzati. '[~, Maxsize] = computer'. Non li link qui perché dipendono dalla tua versione MATLAB, ma per quanto ne so nessuna versione supporta 4.6 * 10^18 elementi. – Daniel

+0

È necessario trovare un solutore che utilizzerà un puntatore/handle di funzione anziché una matrice memorizzata. Ho appena guardato ma non ho trovato nulla. Tuttavia, sono sicuro che ne esiste uno. Detto questo, ho il sospetto che avrete problemi di precisione con tanti elementi indipendentemente dal risolutore. – AnonSubmitter85

risposta

0

Se si ha accesso a Toolbox Parallel Computing di MATLAB con MATLAB Distributed Computing Server, si può essere in grado di memorizzare A come distributed array, in altre parole un singolo array i cui elementi sono distribuiti attraverso i ricordi di più macchine in un cluster . Puoi chiamare il comando backslash di MATLAB direttamente su un array distribuito, e MATLAB gestisce la parallelizzazione per te.

+0

Sembra interessante grazie! Li ho cercati e non sono riuscito a trovare quanto segue: Sai se gli array distribuiti possono contenere più elementi rispetto agli array normali? Ho pensato che il problema è che l'indice degli elementi è limitato. Gli array distribuiti superano questo? – OOO

+0

@OOO L'array distribuito può essere in grado di contenere più elementi di un array normale ** se ** i diversi operatori sono su macchine ** separate ** (in modo da aumentare effettivamente la memoria totale disponibile). In caso contrario, la distribuzione di lavori su più core della stessa macchina ti farà guadagnare tempo di elaborazione, non memoria extra. – Hoki

+0

@Hoki Grazie. Solo per essere sicuro: il mio problema non è con la memoria ma con il numero di elementi (cioè, una matrice sparsa vuota ha una dimensione limitata come in questa pagina: http://www.mathworks.com/matlabcentral/answers/91711-what- is-the-maximum-matrix-size-for-each-platform), l'array distribuito su più macchine ha un numero maggiore di elementi? – OOO

1

Se non si utilizza Matlab, è possibile archiviare array più grandi. ROOT è un framework open source sviluppato al CERN che ha interfacce C++ e Python e una varietà di solutori. È anche in grado di gestire enormi set di dati e ha anche una varietà di strumenti di visualizzazione e analisi.

Se sei interessato a scrivere C o Fortran BLAS(Basic Linear Algebra Subroutines) e CBLAS sarebbero buone opzioni. Ci sono molte implementazioni open source e proprietarie di BLAS che dovrebbero essere disponibili per la maggior parte delle distribuzioni Linux/UNIX. Ci sono anche molti esempi che mostrano come usare le subroutine BLAS in C e il codice Fortran disponibile online.

0

Ho voluto inserire questo come commento, ma penso che sia meglio dichiararlo come una risposta. Hai un problema serio. Non è solo un problema di indicizzazione, è anche un problema di memoria: 4.6x10^18 è enorme. Questo è 4,6 elementi exa. Se li memorizzi come vera precisione singola, hai bisogno di 4x4.6 exabyte di memoria. Un computer che ha una memoria così grande, non esiste ancora per mia conoscenza. Sarà necessario raccogliere tutta la memoria (disco rigido, non RAM) di una percentuale significativa di tutti i computer del mondo per memorizzare una matrice di questo tipo. Pensaci. Passare a 10^40 elementi è quasi impraticabile per il momento. Con i tuoi computer a 64 bit, lo spazio di indirizzamento a 64 bit può sopportare soppesamente 4.6x10^18 elementi. L'indirizzo a 64 bit (o intero) rende possibile l'indicizzazione diretta di 2^64 elementi che è approssimativamente 16x10^18. Quindi devi pensarci due volte.

Tornando al problema in sé, ci sono possibilità che tu possa trasformare la tua matrice in un operatore implicito. Per operatore implicito, voglio dire, non hai bisogno di memorizzarlo, perché ha un modello che sai come riprodurre, oppure puoi applicarlo a un vettore senza effettivamente formare la matrice. Se hai la matrice in mano, sei molto probabile in questa situazione, considerando quello che ho detto sopra. Se questo è il caso, per risolvere il tuo problema, devi semplicemente usare un solver iterativo e fornire una scatola nera che faccia la tua moltiplicazione di matrice.Andare in altre direzioni potrebbe essere uno spreco di tempo.

+0

OP ha dichiarato che è una matrice sparsa. – rlbond

+0

@rlbond Non capisco il tuo punto. Puoi spiegare un po '? – innoSPG

+0

https://en.wikipedia.org/wiki/Sparse_matrix – rlbond