2009-02-23 8 views
7

È possibile aprire un foglio di lavoro in excel da matlab e modificare le formule? L'idea è di automatizzare un'analisi dell'incertezza creando un secondo foglio con l'incertezza in ogni cella per il valore della cella precedente. Essenzialmente, voglio trattare le celle come variabili e fare SQRT (SUM (Partials (xi)^2)) per ogni cella. Matlab non dovrebbe avere problemi con il calc, ma può modificare le formule nei fogli?Modificare un foglio Excel da Matlab

Attualmente il processo è di copiare e incollare da excel a matlab. Ecco una piccola funzione che fa l'incertezza in MATLAB contro su serie di equazioni:

function [f_u_total f_u] = uncertAnalysis(f, vars, vars_u) 
    f_u = []; 
    f_u_total = []; 
    for(i=1:length(f)) 
     f(i) 
     item = uncertAnalysisi(f(i), vars, vars_u); 
     f_u = [f_u; item(1)]; 
     f_u_total = [f_u_total; item(1)]; 
    end 
end 


function [f_u_total f_u] = uncertAnalysisi(f, vars, vars_u) 
    f_u = []; 
    % take the partials and square them 
    for i=1:length(vars) 
     f_u = [f_u; vars(i) (diff(f, vars(i)).*vars_u(i)).^2]; 
    end 
    % calculate the RSS 
    f_u_total = (sum(f_u(:,2))).^.5; 
end 

Per inciso, le equazioni aspetto qualcosa di simile (il motivo per cui non sto facendo tutto a mano):

=(9*C!S3^2/C!V3^4*C!W3*(C!O3- 
C!P3)/C!X3*C!Q3^6*C!F3^4/C!Y3^6/(C!U3^C!Z3)^6*F3^2+1/4*C!S3^2/C!V3^4*C!W3/(C!O3- 
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*O3^2+1/4*C!S3^2/C!V3^4*C!W3/(C!O3- 
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*P3^2+9*C!S3^2/C!V3^4*C!W3*(C!O3- 
C!P3)/C!X3*C!Q3^4*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*Q3^2+1/C!V3^4*C!W3*(C!O3- 
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*S3^2+9*C!S3^2/C!V3^4*C!W3*(C!O3- 
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*C!Z3^2/C!U3^2*U3^2+4*C!S3^2/C!V3^6*C!W3*(C!O 
3-C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*V3^2+1/4*C!S3^2/C!V3^4/C!W3*(C!O3- 
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*W3^2+1/4*C!S3^2/C!V3^4*C!W3*(C!O3- 
C!P3)/C!X3^3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*X3^2+9*C!S3^2/C!V3^4*C!W3*(C!O3- 
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^8/(C!U3^C!Z3)^6*Y3^2+9*C!S3^2/C!V3^4*C!W3*(C!O3- 
C!P3)/C!X3*C!Q3^6*C!F3^6/C!Y3^6/(C!U3^C!Z3)^6*LOG(C!U3)^2*Z3^2)^(1/2) 
+0

devo chiedere, perché stai usando Excel per questo a tutti? Non è realmente inteso per analisi di dati scientifici come questo. Potrebbe essere meglio esportare i dati in file di testo, importarli in MATLAB, calcolare i risultati, quindi salvare come testo e importare nuovamente in Excel. –

+1

David, è lo "standard" nel nostro laboratorio (laboratorio di ingegneria meccanica). Sono d'accordo e mi piace mantenere le cose puramente in MATLAB se posso. Devo dire però che Excel ha i suoi meriti. Ad esempio, avere il foglio 'programmato' mentre si prendono i dati fornisce alcuni bei calcoli/visualizzazioni in tempo reale. – ccook

risposta

5

Dovreste essere in grado di farlo attraverso COM/ActiveX/Automation. Guarda il documento External Interfaces; c'è un esempio su come accedere ai documenti Excel tramite le interfacce di automazione di Excel.

In questo modo, ho praticamente nessuna esperienza nella gestione di Excel in questo modo, ma so che è possibile eseguire qualsiasi cosa in Excel tramite l'automazione e la modifica delle formule di una cella non sembra così difficile.

edit: non riesco a trovare un riferimento al modello a oggetti di Excel, ma ecco un altro esempio: http://support.microsoft.com/kb/301982

+0

Grazie, Jason, sembra promettente. Sembra che potrei aggiungere anche un foglio di lavoro aggiuntivo alla cartella di lavoro. – ccook

+0

Dai un'occhiata a http://www.mathworks.com/support/solutions/data/1-17PWC.html?solution=1-17PWC per un esempio. – nimrodm

2

EDIT: La mia ipotesi precedente che XLSWRITE non funzionasse era sbagliata. Ho appena provato quanto segue in MATLAB:

xlswrite('xltest.xls',{'1' '2' '=SUM(A1,B1)'}); 

e quando ho aperto il file in Excel, la funzione era effettivamente lì! La limitazione su questo sarebbe che dovresti usare solo le funzioni che sono in Excel.

Sfortunatamente, non credo che XLSREAD possa leggere le formule in MATLAB (sembra solo ottenere il risultato).

OPZIONI suggerito in precedenza:

Si consiglia di controllare il software Spreadsheet Link EX sul sito web di The MathWorks, anche se sono un po 'familiarità con essa e non sono sicuro se anche questo può fare quello che ti serve. Qualcos'altro da guardare è lo MATLAB Builder EX, che "consente di integrare le applicazioni MATLAB® nelle cartelle di lavoro Excel® della tua organizzazione come funzioni macro o add-in". Sembra promettente ...

+0

Sembra simile ad alcuni metodi di lettura XLS che ho usato in LabView ... hm. Controllando il link, ty – ccook

+0

penso che funzionerebbero sicuramente, anche se in qualche modo una barriera di prezzo. Se non trovo un'opzione gratuita penso che andrò con quello che sembra il secondo. ty +1 – ccook

+0

Grazie per l'aggiornamento. Peccato che la lettura non funzioni :( – ccook

2

Questa non è una soluzione estremamente elegante, ma se salvi un nuovo foglio di lavoro .xls che è semplicemente un file delimitato da tabulazioni (o CSV), puoi fare in modo che Matlab generi le formule e quando Excel apre il documento i valori si popoleranno.

In Perl, ho gestito è qualcosa di simile:

 
open(OUTPUT,'>tmpfile.xls'); 
print OUTPUT "1\t2\t=A1+B1\n"; 
close(OUTPUT); 

E quando tmpfile.xls si apre in Excel, cella C1 visualizzerà come 3, che aggiornerà dinamicamente in modo appropriato se A1 o B1 sono cambiati.

(io non sono bravo con Matlab, quindi non ho alcuna conoscenza di qualsiasi tipo di plugin)

+0

per chiarire, è possibile salvarla come xls e che manterrà le equazioni e non i valori? – ccook

+0

Questo è corretto. È decisamente janky, ma Excel eseguirà la traduzione automatica e manterrà le formule. nel dubbio, aprilo e poi salvalo come "reale" .xls :) (Mi sento orribile a suggerire questo, però) – kyle

+0

lol, "janky" in effetti. Ma potrebbe essere il modo più semplice per ottenere le formule. – ccook

2

Usa COM/ActiveX.È possibile aprire un'istanza di Excel tramite il seguente comando:

xlApp = COM.Excel.Application; 

Poi utilizzano una combinazione di completamento del codice e l'aiuto VBA in Excel per sé a lavorare fuori il resto.

Ricordarsi di chiudere Excel con

xlApp.Quit; 
delete(xlApp); 

Una nota a parte, i cosiddetti CSE (Control-Shift-Invio) formule può aiutare? Vedi Google.

+0

Non hai bisogno di qualcosa che precede il tuo primo comando in modo da avviare COM? Se lo fai, qual è il comando? – Hans

+0

No. Dovrebbe funzionare. – Nzbuu

+0

È uguale a xlApp = actxserver ('Excel.Application'); ? – Hans