venerdì 30 maggio 2008

MATLAB Warning: Initializing Handle Graphics failed in matlabrc.

Ciao a tutti!
Sono finalmente di nuovo a postare su queste pagine anche se il mio tempo libero è praticamente inesistente... ma quando c'è qualcosa di veramente particolaristico e introvabile da dire... non mi posso tirare indietro!
Si tratta di una ennesima questione di MATLABsuLinux da risolvere.

Ieri dopo un riassetto lungo un mese dei miei dischi fissi e dei dati sul mio Desktop, con tanto di reinstallazione di ArchLinux come OS... e al tempo stesso dopo il fallimento del mio caro vecchio portatile il mitico KuBook, con annessa migrazione su un altro "vecchio" portatile a disposizione, e installazione da zero di Arch anche lì...
Ho installato MATLAB R2007a su ArchLinux sotto un kernel 2.6.25, con JRE 1.6.0_05-b13 e Xorg 1.4.0.90

Dopo una tranquilla installazione e un setup senza problemi con lo script install_matlab che bisogna far girare dopo l'installazione (copia dei file) con l'installer grafico, ho aperto il programma per vedermi questo messaggio come output del processo di inizializzazione, in quanto compariva appena prima del prompt:

Warning: Initializing Handle Graphics failed in matlabrc.
This indicates a potentially serious problem in your MATLAB setup, which should be resolved as soon as possible. Error detected was:
MATLAB:badsubscript
Attempted to access monitors(1,:); index out of bounds because size(monitors)=[0,4].

In matlabrc at 108

Ho cominciato allora con il cercare su Internet informazioni riguardo al problema, ma ho trovato solo riferimenti ad un messaggio di errore molto simile, dovuto però alla mala configurazione del locale o al non aggiornamento di pathdef.

Ho provato allora a capire "chi chiamava chi" durante l'inizializzazione e andanto in matlabrc.m alla linea 108 ho trovato la chiamata ad un altro script di inizializzazione/configurazione: hgrc.m
(Tutti questi file di configurazione si trovano nella vostra directory $MATLAB/toolbox/local/ dove con $MATLAB s'intende il vostro percorso di installazione di MATLAB).

In hgrc.m ho trovato la chiamata a "get" per l'assegnasione della matrice monitors responsabile dell'errore.

Nel sito che raccoglie la documentazione tecnica di MathWorks si possono trovare tutte le "Handle Graphics Object Properties" in questa pagina
Se facilmente selezionate la categoria root, dalla lista di sinistra troverete proprio la proprietà "MonitorPosition" la cui chiamata porta all'errore di inizializzazione.

In realtà la chiamata di "get" in hgrc.m assegna a monitors il risultato del parametro MonitorPosition riconosciuto dal sistema MATLAB.

Probabilmente a causa di una incompatibilità tra Java e X (non sono riuscito ad installare FemLab a causa di un conflitto tra le ultime versioni di Java e di X) la funzione get ritorna una irregolare matrice di zeri dalla chiamata a MonitorDefinition

La mia soluzione è stata abbastanza brutale. Ho letto che dati avrebbe dovuto restituire la chiamata get(0,'MonitorPosition'), e li ho assegnati manualmente alla variabile monitor modificando lo script hgrc.m

Come potete trovare nella pagina di documentazione precedentemente linkata:


MonitorPosition
[x y width height;x y width height] Width and height of primary and secondary monitors, in pixels. This property contains the width and height of each monitor connnected to your computer. The x and y values for the primary monitor are 0, 0 and the width and height of the monitor are specified in pixels. The secondary monitor position is specified as
x = primary monitor width + 1
y = primary monitor height + 1
Querying the value of the figure MonitorPosition on a multiheaded system returns the position for each monitor on a separate line.
v = get(0,'MonitorPosition')
v =
x y width height % Primary monitor
x y width height % Secondary monitor
Note that MATLAB sets the value of the ScreenSize property to the combined size of the monitors


La matrice monitors per uno schermo 1024x768 come il mio dovrebbe essere:
monitors = [0,0,1024,768;1025,769,1024,768];

e per un 1280x1024 come il mio Desktop dovrebbe essere:
monitors = [0,0,1280,1024;1281,1025,1280,1024];


Quindi ho commentato la linea della chiamata incriminata in hgrc.m:
monitors = get(0, 'MonitorPosition');

inserendo un carattere '%' all'inizio delle linea stessa... e ho assegnato manualmente la matrice corretta per il mio monitor alla variabile monitors:
monitors = [0,0,1024,768;1025,769,1024,768];

Dopo questo "workaround" MATLAB parte senza problemi e mostra ogni figura correttamente.

Questo è tutto! Spero che questa soluzioen sia utile a qualcuno...

Keep On Hacking!
bYe,
Andy

4 commenti:

  1. Ho avuto lo stesso errore lanciando MATLAB R2007a su Slackware 12.1 (kernel 2.6.24.5 con JRE 1.6.0_06-b02 e Xorg 1.4.0.90). Grazie al tuo post ho risolto velocemente! :)

    RispondiElimina
  2. grazie anche da parte mia, stesso problema risolto in un attimo (previo chmod 777 sul file, dato che il mio era marcato come read only)

    RispondiElimina
  3. Ciao a tutti!
    Grazie a voi che commentate, fa sempre piacere vedere che un proprio post è stato utile a qualcuno! ;-)

    Se volete 2 dritte veloci, ho appena scoperto che con la nuova versione di Java (quella fornita da ArchLinux almeno) funziona senza problemi MATLAB R2008 mentre prima dava problemi.
    Ai primi avvii ho avuto problemi di salvataggio delle impostazioni ma era dovuto ad un problema di permessi di tutta la cartella .matlab nella mia home, che in realtà era posseduta da root. Sistemando l'owner con il mio utente con chown si è risolto tutto!

    Che dire, dopo gli opportuni smadonnamenti, come sempre, VIVA LINUX! ;-)

    bYe,
    Andy

    RispondiElimina
  4. GRANDE GRANDE GRANDE GRANDE Andy
    Ora corretti i SUOI di errori posso pensare ai MIEI.

    GRAZIE ancora, il post non è utile, VITALE!

    E cmq, VIVA LINUX (e l'unico motivo per cui ho deciso di pagare alla mathwork la licenza...)

    Grazie, Luigi

    RispondiElimina