2009-02-23 31 views
7

¿Es posible abrir una hoja de trabajo en excel desde matlab y editar las fórmulas? La idea es automatizar un análisis de incertidumbre creando una segunda hoja con la incertidumbre en cada celda para el valor de la celda anterior. Esencialmente, quiero tratar las celdas como variables y hacer SQRT (SUMA (parciales (xi)^2)) para cada celda. Matlab no debería tener problemas con el calc, pero ¿puede editar las fórmulas en hojas?Modificar una hoja de Excel de Matlab

Actualmente, el proceso consiste en copiar y pegar de excel a matlab. He aquí una pequeña función que hace la incertidumbre en Matlab contra el conjunto de ecuaciones:

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 

Como acotación al margen, las ecuaciones se ven algo como esto (¿por qué no estoy haciendo esto 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

tengo que preguntar, ¿por qué está usando Excel para esto en absoluto? No es realmente para el análisis de datos científicos como este. Puede que sea mejor exportar los datos a archivos de texto, importarlos a MATLAB, calcular los resultados, guardarlos como texto e importarlos nuevamente a Excel. –

+1

David, es el "estándar" en nuestro laboratorio (laboratorio de ingeniería mecánica). Estoy de acuerdo, y me gusta mantener las cosas puramente en matlab si puedo. Debo decir sin embargo, Excel tiene sus méritos. Por ejemplo, tener la hoja 'programada' mientras toma datos proporciona algunos cálculos/visualizaciones agradables en tiempo real. – ccook

Respuesta

5

Usted debe ser capaz de hacerlo a través de COM/ActiveX/Automatización. Mire el documento External Interfaces; hay un ejemplo de cómo acceder a los documentos de Excel a través de las interfaces de automatización de Excel.

Tengo experiencia al lado de la manipulación de Excel de esta manera, pero sé que puede hacer casi cualquier cosa en Excel a través de la automatización y la edición de fórmulas de la celda no suena tan difícil.

editar: No puedo encontrar una referencia al modelo de objetos de Excel, pero aquí está otro ejemplo: http://support.microsoft.com/kb/301982

+0

Gracias jason, esto parece prometedor. Parece que podría agregar una hoja de trabajo adicional al libro de trabajo también. – ccook

+0

Eche un vistazo a http://www.mathworks.com/support/solutions/data/1-17PWC.html?solution=1-17PWC para ver un ejemplo. – nimrodm

2

EDITAR: mi suposición anterior de que XLSWRITE no funcionaría era incorrecta. Acabo de probar lo siguiente en MATLAB:

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

y cuando abrí el archivo en excel, ¡la función estaba de hecho allí! La limitación de esto sería que tendría que usar solo las funciones que están en Excel.

Desafortunadamente, no creo que XLSREAD pueda leer las fórmulas en MATLAB (parece que acaba de obtener el resultado).

OPCIONES sugerido anteriormente:

Es posible que desee comprobar hacia fuera el software Spreadsheet Link EX en el sitio web de The MathWorks, aunque estoy un poco familiarizado con él y no estoy seguro si incluso eso puede hacer lo que necesita. Otra cosa que debe considerar es MATLAB Builder EX, que "le permite integrar aplicaciones MATLAB® en los libros de Excel® de su organización como macro funciones o complementos". Suena prometedor ...

+0

Parece similar a algunos métodos de lectura XLS que utilicé en LabView ... hm. Revisando el enlace, ty – ccook

+0

, creo que definitivamente funcionaría, aunque parezca una barrera de precios. Si no encuentro una opción gratuita, creo que iré con lo que parece el segundo. ty +1 – ccook

+0

Gracias por la actualización. Es una pena que la lectura no funcione :( – ccook

2

No es una solución terriblemente elegante, pero si guarda una nueva hoja de cálculo .xls que es simplemente un archivo delimitado por tabuladores (o CSV), puede hacer que Matlab genere fórmulas y cuando Excel abre el documento los valores se poblarán

En Perl, he manejado es algo como esto:

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

Y cuando tmpfile.xls se abre en Excel, célula C1 se mostrará como 3, que se actualizará dinámicamente apropiadamente si A1 o B1 se cambian.

(No soy bueno con Matlab, así que no tengo conocimiento de ningún tipo de plugins)

+0

para aclarar, puedes guardarla como un xls y eso mantendrá las ecuaciones y no los valores? – ccook

+0

Correcto. Definitivamente es tonto, pero Excel hará la auto traducción y mantendrá las fórmulas. en duda, ábrelo y luego guárdalo como .xls "reales" :) (me siento horrible al sugerir esto, sin embargo) – kyle

+0

lol, 'janky' de hecho. Pero podría ser la forma más fácil de obtener las fórmulas. – ccook

2

Uso COM/ActiveX.Puede abrir una instancia de Excel mediante el comando siguiente:

xlApp = COM.Excel.Application; 

continuación, utilizar una combinación de finalización de código y la ayuda de VBA en Excel sí mismo para trabajar el resto.

olvide cerrar Excel con

xlApp.Quit; 
delete(xlApp); 

En una nota lateral, los llamados CSE (Control-Shift-Enter) fórmulas pueden ayudar? Ver Google.

+0

¿No necesita algo antes de su primer comando para iniciar COM? Si lo haces, ¿cuál es el comando? – Hans

+0

No. Simplemente debería funcionar. – Nzbuu

+0

¿Es eso lo mismo que xlApp = actxserver ('Excel.Application'); ? – Hans

Cuestiones relacionadas