2016-01-26 4 views
0

В настоящее время я работаю над проектом, который создает и требует больше данных, чем может обрабатывать моя оперативная память. Поэтому я сохраняю свои данные как .mat-файлы для обработки. Однако, когда я пытаюсь сохранить свою трехмерную матрицуuint8 в качестве файла и загрузить ее снова (используя функции save и load), я не получаю те же данные, что и раньше. Вызов whos Фактически, кажется, загружается -by- struct. Я просматривал документы save и load MATLAB, но, похоже, не понимаю, как я могу добиться того, что хочу.Сохранение матрицы, но загрузка структуры в MATLAB?

Сейчас я работаю на R2014b MATLAB с 8GB RAM. Точная whos выхода к переменному я пытаюсь сохранить и нагрузки, приведенные ниже:

whos output

я должен быть добавление опции к save и load функции? Я понимаю, что есть возможность указать точность хранящихся номеров, но не их тип и структуру данных. Мои вызовы для функций ниже:

Где я сохранить файл

for i = 1:N 
    for j = times(i,1):times(i,2) 
     frame = vreader.read(j); 
     temp_bead(j,1:mod_height,:) = frame(1:mod_height,:); 
     dispstat(sprintf('Processing Bead %d/%d',i,N),'timestamp'); 
    end 
    % Copying the matrix data into a new matrix 
    matrixname = strcat('UncroppedBeadMatrix',int2str(i)); 
    dir = strcat(pwd,foldername,'\',matrixname); 
    whos('temp_bead'); 
    save(dir, 'temp_bead','-double'); 
end 

Где загрузить мой файл

foldername = '\UncroppedBeadData'; 
matrixname = strcat(pwd,foldername,'\UncroppedBeadMatrix',int2str(i),'.mat'); 
uncropped_matrix = load(matrixname); 

Пожалуйста, не стесняйтесь задавать любые вопросы, которые могут уточните мой вопрос.

+0

Я бы попытался отделить 3D-матрицу от сохранения памяти из памяти. Они могут быть несвязанными.Вот что я пробовал: «X = randi (10,10,10,10, 'uint8') save X удалить все загрузить X", и я вернул 3D-матрицу (а не структуру). Возможно, попробуйте это, а также попытайтесь сохранить большую 2D-матрицу и проверьте, есть ли у вас такая же проблема, как большая трехмерная матрица. Кроме того, разделяя измерения, с которыми вы имеете дело, и ваши пределы RAM могут помочь кому-то еще попытаться воспроизвести это. – akamath

+0

@akamath просто разделил размеры переменной и спецификации моего компьютера. Я попробую ваше предыдущее предложение позже позже. –

+0

@SharanDuggirala вы должны добавить строку кода, в которой вы вызываете 'save' и где вы вызываете' load' ... – Dan

ответ

4

Это потому, что вы загружаетесь в переменную, то есть ваш оператор load имеет назначение левой руки. Это то, что делает его struct. Тем не менее, вы можете легко получить исходную матрицу из этого struct:

uncropped_matrix.temp_bead 

другой (но хуже) альтернатива уронить LHS от вашего load и просто позвоните

load(matrixname); 

Это будет «пуф» в переменную, называемую temp_bead, вместо того, чтобы помогать с промежуточным звеном struct, но это не очень хорошая практика, так как это делает код трудным для понимания, поскольку читатели не могут видеть, какая переменная, которую вы используете, была создана/назначена.

Как Мохсен указывает в комментариях, лучшим вариантом является

load(matrixname, 'temp_bead'); 

Который устранит дэ-посредник struct и позволяет читателям кода, чтобы увидеть, где данные в переменной, указанной (по строке в) matrixname.

+3

Альтернативной более читаемой опцией является 'load (matrixname, 'temp_bead');'. Легко видеть, какая переменная будет загружена и не требуется дополнительное извлечение из структуры. –

+0

@MohsenNosratinia спасибо, я добавлю это. – Dan

+0

@MohsenNosratinia Хорошее предложение! –

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