7

是否可以从matlab中打开excel中的工作表并编辑公式?这个想法是通过创建第二张表来自动化不确定性分析,其中每个单元格中的不确定性来自前一个单元格的值。本质上,我想将单元格视为变量并对每个单元格执行 SQRT(SUM(Partials(xi)^2)) 。Matlab的计算应该没有问题,但是它可以编辑表格中的公式吗?

目前的过程是从excel复制粘贴到matlab。这是一个小函数,它可以在 matlab 中对方程组进行不确定性:

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

顺便说一句,方程式看起来像这样(为什么我不手动这样做):

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

5 回答 5

5

您应该可以通过 COM/ActiveX/Automation 来完成。查看外部接口文档;有一个如何通过 Excel 的自动化接口访问 Excel 文档的示例。

我几乎没有以这种方式操作 Excel 的经验,但我知道您可以通过自动化在 Excel 中做任何事情,并且编辑单元格公式听起来并不难。

编辑:我找不到对 Excel 对象模型的引用,但这是另一个示例:http: //support.microsoft.com/kb/301982

于 2009-02-23T20:43:16.937 回答
2

编辑:我之前认为XLSWRITE不起作用的假设是错误的。我刚刚在 MATLAB 中尝试了以下操作:

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

当我在 excel 中打开文件时,该功能实际上就在那里!对此的限制是您只能使用 Excel 中的函数。

不幸的是,我不相信XLSREAD可以将公式读入 MATLAB(它似乎只是得到结果)。

以前建议的选项:

您可能想查看 MathWorks 网站上的Spreadsheet Link EX软件,尽管我对它有点陌生,并且不确定它是否能满足您的需求。您应该研究的其他内容是MATLAB Builder EX,它“允许您将 MATLAB® 应用程序作为宏函数或插件集成到您组织的 Excel® 工作簿中”。听起来很有希望...

于 2009-02-23T19:51:16.453 回答
2

这不是一个非常优雅的解决方案,但是如果您保存一个.xls只是制表符分隔(或 CSV)文件的新电子表格,您可以让 Matlab 生成公式,当 Excel 打开文档时,这些值将被填充。

在 Perl 中,我处理它是这样的:

打开(输出,'>tmpfile.xls');
打印输出“1\t2\t=A1+B1\n”;
关闭(输出);

tmpfile.xlsExcel 中打开时,单元格将显示为 3,如果或更改C1,它将动态更新。A1B1

(我不擅长 Matlab,所以我对任何类型的插件一无所知)

于 2009-02-23T19:51:35.517 回答
2

使用 COM/ActiveX。您可以通过以下命令打开 Excel 实例:

xlApp = COM.Excel.Application;

然后结合使用代码完成和 Excel 本身中的 VBA 帮助来计算其余部分。

记得关闭 Excel

xlApp.Quit;
delete(xlApp);

附带说明一下,所谓的 CSE(Control-Shift-Enter)公式可能会有所帮助吗?见谷歌

于 2009-02-25T16:57:32.643 回答
1

作为替代方案,请参阅下面的代码 (xlswrite) 以使用 Matlab 中的 ActiveX:

http://www.mathworks.com/matlabcentral/fileexchange/2855

于 2009-06-02T02:23:52.820 回答