2012-07-05 14 views
5

Ho scritto un programma MATLAB che crea al volo funzioni MATLAB personalizzate e le avvia in altre istanze MATLAB utilizzando il comando unix. Io uso questo programma per automatizzare le analisi di neuroimaging fMRI (usando SPM8 per MATLAB), e tutto funziona bene. Tuttavia, MATLAB impone una lunghezza del nome della funzione di massimo 63 caratteri (namelengthmax). Dato che ho bisogno di salvare due diversi timestamp in ciascun nome di funzione insieme al nome della funzione che lo ha creato (ho diverse funzioni che creano queste nuove funzioni utilizzate per l'analisi fMRI multithread), 63 caratteri sono piuttosto limitanti per i nomi di file come :Estensione della lunghezza massima dei nomi delle funzioni MATLAB

atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15.m

In questo esempio atf significa 'filettatura funzione analisi' (per separare dagli altri file con nomi simili), il primo timestamp identifica la corsa (un timestamp globale, in questo caso 5th di July 2012 alle 18:01:02), quindi c'è una stringa specify_1st_level che identifica la funzione (in questo caso specify_1st_level.m) che ha creato questa nuova funzione "analisi thread", e quindi la seconda volta stamp identifica questa nuova specifica "funzione thread di analisi" da altre nuove "funzioni thread di analisi" create per essere eseguite in altri thread (e per diversi argomenti di analisi o per analisi diverse) e che vengono eseguite contemporaneamente.

Il mio problema è il limite di caratteri di 63 caratteri per i nomi di funzione.

Mi rendo conto che avrei potuto scrivere i miei timestamp senza sottolineatura (_), o di comprimerli, e posso fare i miei nomi delle funzioni più breve (ad es specify_1st_level.m -.>sp1st.m), ed inoltre ho potuto dividere le mie funzioni create al volo in diverse sottocartelle create al volo, ad es. con timestamp globali. Modifica: Oppure potrei anche creare un hash dell'intero nome di funzione e usare l'hash come nome di una funzione invece della stringa leggibile dall'uomo presentata sopra.

Tuttavia, ho intenzione di aggiungere più dati nei nomi di "funzioni thread di analisi" (uno o più valori hash di diversi set di parametri di analisi utilizzati in questa analisi per identificare analisi identiche di tempi diversi). Se possibile, mi piacerebbe mantenerlo piacevole e semplice (i nomi delle funzioni leggibili dall'uomo aiutano nel debug delle "funzioni thread di analisi" create al volo).

Quindi, c'è un modo per estenderenamelengthmax? Sto eseguendo MATLAB R2012a in Linux. Sono anche felice di sentire altri modi per risolvere questo problema.

+0

Sono abbastanza sicuro che Matlab lo imposta come una cosa codificata. Puoi guardare 'namelengthmax' dato che è ciò che imposta il massimo. Dubito che possa essere cambiato comunque. –

risposta

2

Rispondendo alla mia domanda: Dopo averci pensato un po ', ho trovato un modo per incorporare tante informazioni come voglio in un nome di funzione MATLAB e mantenere ancora leggibile per gli esseri umani. Innanzitutto, computerò l'hash SHA1 del mio nome file: l'hash SHA1 di atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15.m è E545831A 0002C73B CA095F11 25FC5C51 35B82451 (qui presentato con spazi per chiarezza).

Quindi il nome della mia funzione sarà [ 'atf_', sha1hashString, '.m' ], per questo esempio sarà atf_E545831A0002C73BCA095F1125FC5C5135B82451.m, quindi la lunghezza del nome della funzione sarà di 44 caratteri, non c'è alcun problema. Questo risolve la limitazione di 63 caratteri, ma ho anche bisogno di un modo per essere in grado di trovare le mie funzioni usando i normali comandi bash.

Quindi creerò una copia di tale file di funzione, concatenando l'hash alla fine del nome della funzione originale, in modo che diventi atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_E545831A0002C73BCA095F1125FC5C5135B82451.m. Poi posso trovare il corretto funzionamento facilmente in bash utilizzando ls o find (per scopi di debug), controllare l'hash a partire dalla fine del nome del file e impostare breakpoint in MATLAB debugger nella funzione che verrà chiamata da MATLAB (ad es. atf_E545831A0002C73BCA095F1125FC5C5135B82451.m) e usa il debugger di MATLAB senza problemi.

Questa è la soluzione più pratica a cui riesco a pensare e rende possibile aggiungere hash di set di parametri di analisi anche nel nome della funzione: mi limiterò a calcolare l'hash SHA1 del set di parametri di analisi (assumiamo che SHA1 hash del set di parametri è A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D, e concatenato con il nome della funzione originale sarà atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D.m Poi mi calcolare una nuova hash SHA1 di questo nome funzione originaria ampliata con l'hash SHA1 dei set di parametri di analisi:. hash SHA1 di atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D.m è A81F0083 38868103 F1A0DB69 010279D5 5DB3751E. Poi mi creerò due funzioni identiche, una per MATLAB e uno per i miei scopi di debugging, e si chiamerà atf_A81F008338868103F1A0DB69010279D55DB3751E.m e atf_2012_07_05_18_01_02_specify_1st_level_2012_07_05_18_10_15_A9993E364706816ABA3E25717850C26C9CD0D89D_A81F008338868103F1A0DB69010279D55DB3751E.m. ed è anche possibile avere diversi hash SHA1 di diversi parametri imposta nello stesso nome della funzione in questo modo Ad esempio, uno definin g i soggetti da includere, altri che definiscono i parametri di gestione dei dati ecc., quindi concatenano entrambi o tutti al nome file, quindi calcolano l'hash SHA1 e scrivono due funzioni identiche come sopra.

+1

In teoria c'è ancora una possibilità di collisioni di hash. Quindi, per sicurezza, è possibile aggiungere un controllo prima di scrivere la funzione se esiste già un file/funzione con lo stesso nome/hash e fornire all'utente un avviso o riprovare a scrivere il file un secondo dopo, quindi con un diverso hash. A proposito: alla fine si incorrerà nel sistema operativo [limite di nome di file] (http://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits) per i file di debug: p Ma in ogni modo: bella soluzione;) –

+0

Verifica di hash le collisioni sono una buona idea per la stabilità, anche se le collisioni di hash sarebbero estremamente rare. La lunghezza massima del nome file di 255 caratteri di ext4/ext3/ext2 ecc. È abbastanza per me, almeno per ora. Per nomi di file più lunghi, un'opzione potrebbe cambiare il file system in Reiser4, ha una lunghezza massima del nome file di 3976 byte. – nrz

4

Sono abbastanza sicuro che non è possibile modificare la limitazione per la lunghezza del nome. Ma forse puoi omettere la data nel 2 ° timestamp. Invece di salvare il timestamp completo basta usare l'offset (nel formato 'HH: MM: SS' se l'esecuzione ha bisogno di x ore per finire, nel formato 'dd HH: MM: SS' se l'esecuzione ha bisogno di x giorni per finire; ...).

Inoltre si può guardare

help datenum 

al fine di accorciare il timestamp. Ma questa funzione non risulta in timestamp leggibili dall'uomo.

Ora non è molto intelligente, ma mi sembra un problema che richiede una soluzione molto pragmatica.

+0

da offset intendo la differenza tra i due timestamp – georg

+0

Lasciando la data su salva alcuni caratteri, così come quella di comprimere in una forma non leggibile, che ho già detto. Ma questi non risolvono il problema fondamentale di 'namelengthmax' limitato e quindi non consentono il mio piano di incorporare gli hash dei set di parametri nel nome della funzione. Vedi la mia risposta a me stesso. – nrz

Problemi correlati