Assuming that the file was saved properly on 'computer 1', without any issues. The possible answers to your questions are as follows:
1) Why can't I load the .mat file in MATLAB on computer 2? What is the underlying reason for the error?
The fact that the MAT file loads fine on 'computer 1', one possibility is that the file may have been corrupted during the transfer to 'computer 2' using the cloud storage service. While there can be many reasons behind this, one way to verify this is to re-send the file to 'computer 2' using a different approach, (say using a USB flash drive / external hard drive/email / a different cloud storage service). Then try to load it in MATLAB on 'computer 2'. I have had a similar experience when transferring a large MAT file using Box (https://www.box.com/) corrupted the MAT file. I would also suggest trying out MATLAB Drive for storing and transferring your MATLAB related files:
2) Is the MAT file corrupt?
The error suggests that the MAT file is probably corrupt and there is very little that can be done about it. Another indication of the MAT file being corrupt are error messages related to 'HDF5' appearing on the MATLAB Command Window / Linux or MacOS Terminal / Windows Command prompt.
For example:
HDF5-DIAG: Error detected in HDF5 (1.8.12) thread 0:
#000: H5Dio.c line 179 in H5Dread(): can't read data
major: Dataset
minor: Read failed
#001: H5Dio.c line 547 in H5D__read(): can't read data
.....
3) Can the data in the file be recovered somehow?
You can try to recover the 'non-corrupt' portions of individual variables in the mat file by using the 'matfile' command (https://www.mathworks.com/help/matlab/ref/matlab.io.matfile.html). Consider for example that 'test.mat' has a variable 'v' that is unreadable. You can first get the size of this variable using the 'size' function as follows:
m = matfile('test.mat');
size(m,'v')
ans =
6 100
This tells us that the variable 'v' in 'test.mat' is a 2-D array that has 6 rows and 100 columns (a total of 600 values). You can then try to read the 'non-corrupt' values in 'v' and store them in a new array 'vRec' as follows:
vRec = zeros(6,100); % pre-allocate for efficiency
for i = 1:6
for j = 1:100
try
vRec(i,j) = m.v(i,j); % store the value if it is not corrupt
catch
vRec(i,j) = NaN; % if the value is corrupt/unreadable store 'NaN'
disp([int2str(i) ',' int2str(j) ' is unreadable.']); % display the indices of the unreadable elements
end
end
end
The above code will try to read all the 'non-corrupt' values in 'v' and store them in 'vRec'. The corrupt values in 'v' will be stored as 'NaNs'.
0 Comments
Sign in to comment.