如何提高此xlsread for循环的速度?

时间:2016-06-16 10:08:44

标签: matlab for-loop xlsread

我创建了一个脚本,其中包含一个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

3 个答案:

答案 0 :(得分:2)

如果您想要循环,请不要使用xlsread。因为它打开excel然后每次调用它时关闭excel服务器,这很费时间。相反,在循环之前使用actxserver打开excel,执行您想要的操作,最后在循环后关闭actxserver。有关使用actxserver的一个很好的示例,请在MATLAB帮助中搜索"使用Excel作为自动化服务器阅读电子表格数据"

另请查看readtable,其工作速度比xlsread快,但会生成一个表格。

答案 1 :(得分:1)

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

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

同时检查你每次阅读的数量,如果你在第一个文件中读了很多行,你可以使A的第一个维度变大,然后你每次阅读时都填写它文件?

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

答案 2 :(得分:0)

this post中所述,最容易改变的是将'Basic'设置为true。这会禁用Excel中的公式和宏等内容,并允许您更快地读取简单表。例如,您可以使用:

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

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