Can';不要打开matlab文件

Can';不要打开matlab文件,matlab,Matlab,我有一个“.mat”文件,据说包含一个[3072000x4 double]矩阵(来自加速度计的值)。当我尝试在Matlab中使用“导入数据”打开此文件时,我得到以下错误: Error using load Can't read file F:\vibration_exp_2\GR_UB50n\bearing1\GR_UB50n_1_2.mat. Error using load Unknown text on line number 1 of ASCII file F:\vibration_e

我有一个“.mat”文件,据说包含一个[3072000x4 double]矩阵(来自加速度计的值)。当我尝试在Matlab中使用“导入数据”打开此文件时,我得到以下错误:

Error using load
Can't read file F:\vibration_exp_2\GR_UB50n\bearing1\GR_UB50n_1_2.mat.

Error using load
Unknown text on line number 1 of ASCII file
F:\vibration_exp_2\GR_UB50n\bearing1\GR_UB50n_1_2.mat
"MATLAB".

Error in uiimport/runImportdata (line 456)
                    datastruct = load('-ascii', fileAbsolutePath);

Error in uiimport/gatherFilePreviewData (line 424)
        [datastruct, textDelimiter, headerLines]= runImportdata(fileAbsolutePath,
        type);

Error in uiimport (line 240)
[ctorPreviewText, ctorHeaderLines, ctorDelim] = ...
文件大小为921MB,与我打开的其他文件相同。我还尝试使用python打开该文件,但没有成功。有什么建议吗?我使用MatlabR2013B


更多信息:

创建文件的方式:

%% acquisition of vibration data
% input:
% sample rate in Hz (max. 51200 Hz, should be used as bearing 
% faults are high-frequent)
% time in seconds, stating the duration of the measurement 
% (e.g. 600 seconds = 10 minutes)
% filename for the file to be saved
%
% examples:
% data = DAQ(51200, 600, 'NF1_1.mat'); 
% data = DAQ(51200, 600, 'NF1_2.mat'); 
function data = DAQ(samplerate,time,filename) 

s = daq.createSession('ni'); % Creates the DAQ session
%%% Add the channels as accelerometer channels (meaning IEPE is turned on)
s.addAnalogInputChannel('cDAQ1Mod1','ai0','Accelerometer'); 
s.addAnalogInputChannel('cDAQ1Mod1','ai1','Accelerometer'); 
s.addAnalogInputChannel('cDAQ1Mod1','ai2','Accelerometer'); 
s.addAnalogInputChannel('cDAQ1Mod1','ai3','Accelerometer'); 
%s.addAnalogInputChannel('cDAQ1Mod2','ai0','Accelerometer'); 

s.Rate = samplerate;
s.NumberOfScans = samplerate*time; 
%%% Defining the Sensitivities in V/g
s.Channels(1).Sensitivity = 0.09478; %31965, top outer
s.Channels(2).Sensitivity = 0.09531; %31966, back outer
s.Channels(3).Sensitivity = 0.09275; %31964, top inner
s.Channels(4).Sensitivity = 0.09363; %31963, back inner

data = s.startForeground(); %Acquiring the data

save(filename, 'data');

更多信息:

当我用一个简单的文本编辑器打开文件时,我可以看到很多没有意义的字符​ 还有第一句话:

MATLAB 5.0 MAT-FILE,平台:PCWIN64,创建日期:4月30日星期四 16:29:07 2015


更多信息: 文件本身: 它是921MB


编辑:

如何恢复数据?

我试过了,但内存有问题。 我也试过了,但没有成功。

要确切地回答这个问题,我的建议是首先确保文件没有问题。文件交换上的此工具显然知道如何从V5(R8)版本开始诊断损坏的.MAT文件:

文件大小(索引超出范围)似乎是个问题
Octave
,它应该读取
.mat
文件,给出了错误

memory exhausted or requested size too large for range of Octave's index type

为了找出问题所在,您可能需要在MatLab之外编写一个测试程序,在MatLab之外您可以更好地控制内存管理。例如,包括如何在您自己的平台上构建它们的说明。这些独立程序可能没有相同的内存问题。程序
matdgns.c
是专门用来检查
.mat
文件是否有错误的。

我恐怕不能为您已经知道的内容添加很多好消息,但还没有提到它

无法加载.mat文件的原因是数据已损坏。使其“不可恢复”的是其内部存储的方式。中指定了确切的格式。所以我决定手动构造一个简单的读取器来专门读取.mat文件

有道理,
splitmat.m
无法恢复任何内容,因为它基本上会将数据分割成块,每个块存储一个变量,但是在这种情况下,只存储了一个变量,因此只有一个块,恰好是损坏的块

在这种情况下,数据存储为
miccompressed
,这是使用gzip压缩的普通matlab数组。(作为旁注,这似乎不适合“随机”振动数据。)这可能解释了之前关于文件大小小于完整数据的评论,因为文件大小与内部存储的值非常匹配

我提取了压缩后的档案,并尝试以各种方式解压。基本上,它是一个没有标题的“.gz”,可以手动追加。不幸的是,在数据集的开始处似乎有一个损坏的块。我绝对不是gzip方面的专家,但据我所知,字典(或解密密钥)是动态存储的,这使得所有数据从数据块损坏的那一刻起就毫无用处。如果你真的很想知道,甚至在数据被破坏的情况下,也会出现这种情况,但是这种方法非常耗时。此外,验证这些部分数据的唯一方法是手动检查,在您的情况下,手动检查可能非常困难

下面是我用来提取.gz文件的代码,如果您想尝试一下,这可能会帮助您开始。如果您设法解密数据,您可以按照,13f中的说明读取数据


导入数据
=<代码>加载。对于.mat文件,应分别使用
加载
。显然,
importdata
在引擎盖下使用了它。我也尝试了加载,然后我得到一个简单的错误,说它无法打开文件。(未提供进一步信息)此文件来自何处?它实际上是一个
*.mat
文件吗?我将在问题中添加创建该文件的脚本。这是一个.mat文件,我有许多其他文件是由同一个脚本创建的。我认为文件有点损坏,但是文件大小还可以,所以我正在寻找一种恢复数据的方法。用于保存这些文件的MATLAB版本与您使用的版本相同吗?这是唯一有问题的文件吗?加载(文件名,-mat')
会发生什么情况?我试过这个工具,它说文件已损坏。@Ojtwist你能与提供文件的人确认数据保存没有因为磁盘已满、磁盘配额不足或电源故障而停止吗?@Ojtwist你应该查看MATLAB中央论坛,它们涉及很多问题。例如:@Ojtwist但是你能确认文件生成成功吗?应该是的。我可以肯定的是,.mat文件中的变量“data”具有正确的维度。此外,该文件的大小正确(应该是920MB左右,实际上是这样)。因此,在我看来,某些数据应该是可恢复的,这似乎是合乎逻辑的……我很想听听对此进行否决的原因。
matdgns.c
程序是为诊断
.MAT
文件而设计的,因此它是主题,尝试
Octave
而不是
Python
打开
.MAT
文件(由OP完成)是一个合乎逻辑的想法。
corrupted_file_id = fopen('corrupt.mat','r');
%% some header data
% can be skipped replacing this block with
% fread(id,132);

%header of .mat file
header_text = char(fread(corrupted_file_id,116,'char')');
subsystem_data_offset = fread(corrupted_file_id,8,'uint8');
version = fread(corrupted_file_id,1,'int16');
endian_indicator = char(fread(corrupted_file_id,2,'int8')');
data_type = fread(corrupted_file_id,4,'uint8'); 
%data_type is 15, so it is a compressed matlab array


%% save te content
data_size = fread(corrupted_file_id,1,'uint32');
gz_file_id = fopen('compressed_array.gz','w');
% first write a valid gzip head
fwrite(gz_file_id,hex2dec('1f8b080000000000'),'uint64',0,'b');

% then write the data sequentialy 
step = 1:1e3:data_size;% 1MB steps
for idx = step
fwrite(gz_file_id,fread(corrupted_file_id,1e3,'uint8'));
end
step = step(end):data_size;% 1B steps
for idx = step
    fwrite(gz_file_id,fread(corrupted_file_id,1,'uint8'));
end
fclose(gz_file_id);
fclose(corrupted_file_id);