2013-12-04 16 views
0

У меня есть серия матовых файлов с именем m1 ... m38. Мне нужно, чтобы быть в состоянии получить доступ ко всем из них сразу, поэтому я использую следующие команды:петля над матами - Matlab

fileList=dir('cleanSample*'); 
m1=matfile(fileList(1).name);..... 

Я зашиты все операторы matfile.

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

for i=1:num1 
    arrWrite=m1.outputArray(i,:); 
    for j=2:num2 
     thename=sprintf('m%i',j); 
     addArray=thename.outputArray(i,:); 

Однако на последней строке, я получаю сообщение об ошибке: «Попытка ссылки на поле из не -структурный массив ". Есть ли способ сделать это, не зацикливая на всех матовых файлах?

Редакция:

Редактировать: около 20 ГБ матовых файлов, поэтому я не могу хранить их все в памяти одновременно.

ответ

1

Положите объекты matfile в массив ячеек, вместо того, чтобы называть их в последовательности:

for ii=1:length(fileList) 
    m{ii} = matfile(fileList(ii).name); 
end 

for i=1:num1 
    arrWrite = m{1}.outputArray(i,:); 
    for j=2:num2 
     addArray = m{j}.outputArray(i,:); 

Я не очень понимаю вашу индексацию, но вы получите идею ...

+0

Если вы посмотрите на редактирование, он не может загрузить весь файл matfile в память. Поэтому он должен открыть их один за другим и изменить то, что у него есть. Основная проблема заключается не в цикле. Потому что я преуспел. Проблема заключается в том, как хранить обратно. – Vuwox

+0

объекты matfile не загружают содержимое в память: они просто обрабатывают файлы. – Peter

+0

Вы правы. Я использую так много «загрузки» – Vuwox

1

Проблема в том, что thename не является структурой. Это строка.

thename=sprintf('m%i',j); 

Так outputArray не является переменной этой строки. Это переменная из вашего matfile.

0

Вот функция, которая перемещается по файлам и извлекает определенную переменную, с той конкретной переменной, которую вы делаете, что вы хотите. Для этого я сохранил эти переменные в cell, потому что я не знал, что вы хотите сделать с этими переменными или с каким типом будут переменные; a cell подобен массиву, но с меньшими ограничениями на то, что его записи могут быть, он использует {} для доступа к элементу и () для доступа к под-ячейкам.

function TestMFiles 
fileNamePrefex = 'm'; 
numFiles = 38; 

%// Pre-Initialize the matrix to save the files in 
all2ndEntries = cell(numFiles, 1); 

for k = 1:numFiles 
    %// temporarily store the wanted variables a in variable 
    currFileName = [fileNamePrefex num2str(k)]; 
    currFile = load(currFileName); 
    currMat = currFile.Mat; 

    %// Store the wanted entries in a cell 
    all2ndEntries{k,1} = currMat(2,1); 
end 

%// Do with cell want you want to do 
disp(all2ndEntries); 
end 

Если память является проблемой, то вы можете поставить команду pack где-то в файле, это вызывает сборщик мусора и тому подобное. Хотя он довольно медленный.

Смежные вопросы