我做了一个脚本,其中包含一个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发布于 2016-06-16 19:52:56
如果你想经历一个循环,就不要使用xlsread。因为每次您调用excel时,它都会打开excel,然后再关闭excel server,这很耗时。取而代之的是,在循环之前使用actxserver打开actxserver,做你想做的事情,最后在循环结束后关闭excel。有关使用actxserver的一个很好的示例,请在MATLAB help中搜索"Read Spreadsheet Data using Excel as Automation Server"。
还可以看看readtable,它比xlsread更快,但生成的是表。
发布于 2016-06-16 18:22:57
最明显的改进似乎是在可能的情况下只加载部分文件。但是,如果这不是一个选项,请尝试只打开每个文件一次是否有帮助(读取所需的所有内容,然后分配它)。
M(:,k+2) = xlsread(textFileName,'C:D');还要检查你每次读入的量,如果你在第一个文件中读入了很多行,你可能会使A的第一个维度变大,然后你每次读一个文件时都会填满它?
作为额外的:在开始时可以找到一个小但简单的改进。不要使用4个load语句,而是使用1,然后根据结果分配变量。
发布于 2017-06-28 03:34:26
正如在this post中提到的,最容易更改的是将'Basic‘设置为true。这将禁用Excel中的公式和宏等内容,并允许您更快地读取简单的表格。例如,您可以使用:
xlsread('CR1643.xlsx','A:A', 'Basic', true)
当我在一个11,000 x 7的Excel工作表上测试它时,这导致加载时间从大约22秒减少到大约1秒。
https://stackoverflow.com/questions/37856121
复制相似问题