2

我制作了一个脚本,其中包含一个 for 循环,从 533 个不同的 excel 文件中选择列并将它们放入矩阵中以便进行比较,但是该过程花费的时间太长(昨天运行了 3 个小时,甚至还没有完成一半!!)。

我知道 xlsread 自然很慢,但是有谁知道如何让我的脚本运行得更快?脚本如下,谢谢!!

%Split the data into g's and h's
CRNum = 533; %Number of Carrington Rotation files
A(:,1) = xlsread('CR1643.xlsx','A:A'); % Set harmonic coefficient columns
A(:,2) = xlsread('CR1643.xlsx','B:B');
B(:,1) = xlsread('CR1643.xlsx','A:A');
B(:,2) = xlsread('CR1643.xlsx','B:B');

for k = 1:CRNum
    textFileName = ['CR' num2str(k+1642) '.xlsx'];
A(:,k+2) = xlsread(textFileName,'C:C'); %for g
B(:,k+2) = xlsread(textFileName,'D:D'); %for h
end
4

3 回答 3

2

xlsread如果您想通过循环,请不要使用。因为它每次调用它都会打开excel然后关闭excel服务器,这很耗时。而是在循环使用之前actxserver打开excel,做你想做的事,最后actxserver在你的循环之后关闭。有关使用 的良好示例, 请在 MATLAB 帮助中actxserver搜索“使用 Excel 作为自动化服务器读取电子表格数据” 。

并查看readtable哪个比 更快xlsread,但会生成一个表格。

于 2016-06-16T11:52:55.553 回答
1

最明显的改进似乎是尽可能只加载部分文件。但是,如果这不是一个选项,请尝试仅打开每个文件一次是否有帮助(读取您需要的所有内容,然后分配它)。

M(:,k+2) = xlsread(textFileName,'C:D');

还要检查你每次读了多少,如果你在第一个文件中读了很多行,你可能会把第一个维度A做大,然后你每次读一个文件都会填充它?

另外:一开始可以找到一个小而简单的改进。不要使用 4 个加载语句,而是使用 1 个然后根据结果分配变量。

于 2016-06-16T10:22:57.373 回答
0

本文所述,最简单的更改是将“基本”设置为 true。这会禁用 Excel 中的公式和宏等内容,并允许您更快地阅读简单的表格。例如,您可以使用:

xlsread('CR1643.xlsx','A:A', 'Basic', true)

当我在 11,000 x 7 Excel 工作表上进行测试时,这导致加载时间从大约 22 秒减少到大约 1 秒。

于 2017-06-27T19:34:26.103 回答