2009-02-23 12 views
7

Est-il possible d'ouvrir une feuille de calcul dans Excel à partir de matlab et d'éditer les formules? L'idée est d'automatiser une analyse d'incertitude en créant une deuxième feuille avec l'incertitude dans chaque cellule pour la valeur de la cellule précédente. Essentiellement, je veux traiter les cellules comme des variables et faire SQRT (SUM (Partials (xi)^2)) pour chaque cellule. Matlab ne devrait pas avoir de problème avec le calcul, mais peut-il éditer les formules en feuilles?Modifier une feuille Excel à partir de Matlab

Actuellement, le processus consiste à copier et coller d'Excel à matlab. Voici une petite fonction qui fait l'incertitude Matlab contre le tableau d'équations:

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 

En aparté, les équations ressemblent à ceci (pourquoi je ne fais pas ça à la main):

=(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

Je dois demander, pourquoi vous utilisez Excel pour du tout? Ce n'est pas vraiment destiné à l'analyse de données scientifiques comme celle-ci. Il vaudrait peut-être mieux exporter les données vers des fichiers texte, les importer dans MATLAB, calculer vos résultats, puis les enregistrer sous forme de texte et les réimporter dans Excel. –

+1

David, c'est la «norme» dans notre laboratoire (laboratoire de génie mécanique). Je suis d'accord, et j'aime garder les choses purement en matlab si je peux. Je dois dire cependant que Excel a ses mérites. Par exemple, avoir la feuille «programmée» pendant que vous prenez des données fournit de jolis calculs/visualisations en temps réel. – ccook

Répondre

5

Vous devriez être en mesure de le faire via COM/ActiveX/Automation. Regardez le document External Interfaces; Il existe un exemple d'accès aux documents Excel via les interfaces Automation d'Excel. J'ai une expérience inégalée de manipuler Excel de cette manière, mais je sais que vous pouvez faire à peu près n'importe quoi dans Excel grâce à l'automatisation et l'édition de formules de cellules ne semble pas si difficile.

edit: Je ne peux pas trouver une référence au modèle d'objet Excel, mais voici un autre exemple: http://support.microsoft.com/kb/301982

+0

Merci jason, cela semble prometteur. Il semble que je puisse ajouter une feuille de travail supplémentaire au classeur. – ccook

+0

Jetez un oeil à http://www.mathworks.com/support/solutions/data/1-17PWC.html?solution=1-17PWC pour un exemple. – nimrodm

2

EDIT: Ma supposition précédente que XLSWRITE ne fonctionnerait pas était erronée. Je viens d'essayer ce qui suit dans MATLAB:

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

et quand j'ai ouvert le fichier dans Excel, la fonction était en fait là! La limitation à ceci serait que vous deviez utiliser seulement les fonctions qui sont dans Excel.

Malheureusement, je ne crois pas XLSREAD peut lire les formules dans MATLAB (il semble juste obtenir le résultat).

OPTIONS: PROPOSÉS DÉJÀ

Vous pouvez consulter le logiciel Spreadsheet Link EX sur le site MathWorks, bien que je suis un peu familier avec elle et je suis pas sûr que même cela peut faire ce que vous avez besoin. Autre chose que vous devriez examiner est MATLAB Builder EX, qui "vous permet d'intégrer des applications MATLAB® dans les classeurs Excel® de votre organisation en tant que fonctions macro ou compléments". Ça a l'air prometteur ...

+0

Cela ressemble à certaines méthodes de lecture XLS que j'ai utilisées dans LabView ... hm. Vérifier le lien, ty – ccook

+0

Je pense que ceux-ci fonctionneraient certainement, un peu d'une barrière de prix si. Si je ne trouve pas une option gratuite, je pense que je vais aller avec ce qui ressemble à la seconde. ty +1 – ccook

+0

Merci pour la mise à jour. Dommage que la lecture ne fonctionne pas :( – ccook

2

Ce n'est pas une solution terriblement élégante, mais si vous enregistrez une nouvelle feuille de calcul .xls qui est tout simplement un fichier délimité par des tabulations (ou CSV), vous pouvez avoir Matlab générer des formules et quand Excel ouvre le document les valeurs vont peupler.

En Perl, je l'ai manié quelque chose comme ceci:

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

Et quand tmpfile.xls est ouvert dans Excel, la cellule C1 affichera comme 3, qui mettra à jour dynamiquement de façon appropriée si A1 ou B1 sont modifiés.

(je ne suis pas bon avec Matlab, donc je ne connais pas de toute sorte de plug-ins)

+0

pour clarifier, vous pouvez l'enregistrer en tant que xls et qui gardera les équations et non les valeurs? – ccook

+0

C'est correct, c'est définitivement janky, mais Excel fera l'auto-traduction et maintenir les formules. dans le doute, ouvrez-le et enregistrez-le comme "réel" .xls :) (Je me sens horrible suggérant cela, cependant) – kyle

+0

lol, 'janky' en effet. Mais c'est peut-être le moyen le plus simple d'obtenir les formules. – ccook

2

Utilisez COM/ActiveX.Vous pouvez ouvrir une instance Excel via la commande suivante:

xlApp = COM.Excel.Application; 

Ensuite, utilisez une combinaison de complétion de code et l'aide VBA dans Excel lui-même pour travailler le reste.

Rappelez-vous de fermer Excel avec

xlApp.Quit; 
delete(xlApp); 

Sur une note de côté, les formules que l'on appelle le CST (Control-Shift-Entrée) peut aider? Voir Google.

+0

N'avez-vous pas besoin de quelque chose qui précède votre première commande pour lancer COM? Si vous le faites, quelle est la commande? – Hans

+0

Non. Ça devrait marcher. – Nzbuu

+0

Est-ce la même chose que xlApp = actxserver ('Excel.Application'); ? – Hans

Questions connexes