2012-01-18 4 views
1

Я написал следующую функцию для импорта файлов excel в matlab. Функция работает нормально, где, вставив имя пути к файлам, скрипты импортируют их в рабочее пространство. Функция показана ниже:векторизация - импорт файлов excel в matlab

function Data = xls_function(pathName); 

%Script imports the relevant .xls files into matlab - ensure that the .xls 
%files are stored in a folder specified by 'pathName'. 
%-------------------------------------------------------------------------- 
TopFolder = pathName; 
dirListing = dir(TopFolder);%Lists the folders in the directory specified 
     %by pathName. 
dirListing = dirListing(3:end);%Remove the first two structures as they 
     %are only pointers. 
for i = 1:length(dirListing); 
    SubFolder{i} = dirListing(i,1).name;%obtain the name of each folder in 
      %the specified path. 
    SubFolderPath{i} = fullfile(pathName, dirListing(i,1).name);%obtain 
      %the path name for each of the folders. 
    ExcelFile{i} = dir(fullfile(SubFolderPath{i},'*.xls'));%find the 
      %number of .xls files in each of the SubFolders. 
    for j = 1:length(ExcelFile{1,i}); 
     ExcelFileName{1,i}{j,1} = ExcelFile{1,i}(j,1).name;%find the name 
       %of each .xls file in each of the SubFolders. 
     for k = 1:length(ExcelFileName); 
      for m = 1:length(ExcelFileName{1,k}); 
       [status{1,k}{m,1},sheets{1,k}{m,1},format{1,k}{m,1}]... 
        = xlsfinfo((fullfile(pathName,SubFolder{1,k},... 
        ExcelFileName{1,k}{m,1})));%gather information on the 
         %.xls files i.e. worksheet names. 
       Name_worksheet{1,k}{m,1} = sheets{1,k}{m,1}{1,end};%obtain 
         %the name of each of the .xls worksheets within 
         %each spreadsheet. 
      end 
     end 
    end 
end 

for n = 1:length(ExcelFileName); 
    for o = 1:length(ExcelFileName{1,n}); 
      %require two loops as the number of excel spreadsheets varies 
      %from the number of worksheets in each spreadsheet. 
     TXT{1,n}{o,1} = xlsread(fullfile(pathName,SubFolder{1,n},... 
      ExcelFileName{1,n}{o,1}),Name_worksheet{1,n}{o,1});%import the 
       %relevant data from excel by using the spreadsheet and 
       %worksheet names previously obtained. 
     Data.(SubFolder{n}){o,1} = TXT{1,n}{o,1}; 
    end 
end 

Единственная проблема со сценарием является то, что она занимает слишком много времени, чтобы работать, если количество .xls файлов большого размера. Я читал, что векторизация улучшит время работы, поэтому я прошу совета относительно того, как я могу изменить этот код, чтобы работать быстрее, посредством векторизации.

Я понимаю, что чтение кода, подобного этому, непросто (тем более, что моя форма кодирования отнюдь не так эффективна, как хотелось бы), но любой совет, который был бы предоставлен, был бы очень оценен.

ответ

1

Я не думаю, что векторизация относится к вашей проблеме, но одна за другой.

В качестве примера для данных, которые вы могли бы использовать cellfun превратить Векторизованных петлю:

tmp = ExcelFileName{1,n} 
result_cell = cellfun(@(x) xlsread(fullfile(pathName,x)),tmp, 'UniformOutput', false)) 

Но ключевой проблемой является плохая реализация xlsread и другие связанные первенствует функции в MATLAB. Что они делают с каждый (!) вызов функции, они создают новый процесс excel (который скрыт), в котором они выполняют вашу команду, а затем завершают его.

Я помню инструмент на matlab central, который повторно использовал тот же экземпляр excel и, следовательно, был очень быстрым, но, к сожалению, я больше не могу его найти. Но, может быть, вы можете найти пример, на котором вы можете основать своего читателя, который повторяет его.


На соответствующую записку - Excel имеет глупое ограничение, что не позволяет вам два файла с таким же именем, которые будут открыты в то же время - и после этого терпеть неудачу с некоторой погрешностью. Так что, если вы запустите свое чтение с векторизованным/параллельным, вы вступаете в новое удовольствие от странных ошибок: D

Для себя я нашел единственный способ использовать эти документы через java с помощью Apache POI libraries. У них есть хорошее преимущество, в котором вам не нужен Excel, - но, к сожалению, требуется некоторое программирование.