Main Content

cdfread

读取常用数据格式 (CDF) 文件中的数据

语法

data = cdfread(filename)
data = cdfread(filename,Name1,Value1,...,NameN,ValueN)
[data,info] = cdfread(filename,...)

说明

data = cdfread(filename) 读取由 filename 指定的常用数据格式 (CDF) 文件中的所有数据。将 filename 指定为字符串标量或字符向量。CDF 数据集通常包含一组特定数据类型的变量,每个变量都有一个关联的记录集。变量可能表示时间值,其中每条记录表示记录观测值的特定时间。cdfread 返回元胞数组中的所有数据,其中每列表示一个变量并且每行表示与变量关联的记录。如果变量具有不同的关联记录数,则 cdfread 会使用 CDF 文件中定义的填充值填充各行,以创建一个矩形元胞数组。

注意

因为 cdfread 将创建临时文件,所以当前工作目录必须是可写的。

data = cdfread(filename,Name1,Value1,...,NameN,ValueN) 从文件中读取数据,其中 Name1、…、NameN 可以是下表中列出的任何名称-值参量。

[data,info] = cdfread(filename,...) 返回有关 info 结构体中的 CDF 文件的详细信息。

名称-值参量
"Records"

指定要读取的记录的向量。记录编号从 0 开始。cdfread 返回一个元胞数组,其中的行数与所读取的记录数相同,其中的列数与变量中的列数相同。

"Variables"

一个字符串标量或字符向量,指定要从文件中读取的单个变量的名称,或一个 1×n 或 n×1 元胞数组,指定要从文件中读取的一个或多个变量的名称。n 必须小于或等于文件中变量的总数。cdfread 返回一个元胞数组,其中的列数与所读取的变量数相同,所读取的每个记录对应一行。

"Slices"

一个 m×3 数组,其中每行指定要沿变量的特定维度开始读取的位置、要对该维度使用的跳过间隔(每个项目、每隔一个项目等等),以及要读取的该维度中的值总数。m 必须小于或等于变量的维数。如果 m 小于维度的总数,则 cdfread 将读取未指定的维度中的每个值([0 1 n]),其中 n 是该维度中的元素总数。

注意:由于 Slices 名称-值参量描述如何处理单个变量,因此它必须与 Variables 名称-值参量结合使用。

"DatetimeType"

用于控制 CDF_TIME_TT2000CDF_EPOCH 数据类型的返回类型的字符串标量或字符向量。如果 DatetimeType 设置为 "datetime"(默认为 CDF_TIME_TT2000),则 cdfread 返回类型为 datetime 的值。如果 DatetimeType 设置为 "native",则 cdfread 返回类型为 int64CDF_TIME_TT2000 值和类型为 doubleCDF_EPOCH 值。

"CombineRecords"

逻辑值,用于确定 cdfread 如何返回从文件中读取的 CDF 数据集。如果 CombineRecords 设置为 false(默认值),则 cdfread 会将数据存储在一个 m×n 元胞数组中,其中 m 是记录数,n 是请求的变量数。如果 CombineRecords 设置为 true,则 cdfread 会将特定变量的所有记录合并到输出元胞数组中的单个元胞中。在此元胞中,cdfread 将标量数据存储为列数组。cdfread 将扩展非标量和字符串数据的维度。例如,不是为每个记录创建包含 20×30 个数组的 1000 个元素,cdfread 将一个元胞中的所有记录存储为一个 1000×20×30 数组。

注意:如果使用 Records 名称-值参量指定要读取的记录,则无法使用 CombineRecords 名称-值参量。

注意:当使用 Variables 名称-值参量读取一个变量时,如果 CombineRecords 名称-值参量为 true,则 cdfread 将以 m×n 数值或字符数组形式返回数据,而不是将数据置于元胞数组中。

注意

要改善处理大型数据文件时的性能,请使用 CombineRecords 名称-值参量。

注意

要改善性能,请禁用打开文件时 CDF 库默认执行的文件验证。有关详细信息,请参阅 cdflib.setValidate

示例

全部折叠

读取 CDF 文件中的所有数据。

data = cdfread("example_364.cdf");
whos data
  Name       Size            Bytes  Class    Attributes

  data      24x8             32608  cell               

从 CDF 变量 TemperatureTime 中读取数据。

data = cdfread("example_364.cdf","Variables",{"Time","Temperature"});
whos data
  Name       Size            Bytes  Class    Attributes

  data      24x2              9504  cell               

读取第一个维度中的第一个值,第二个维度中的第二个值,第三个维度中的第一个和第三个值,以及 CDF 变量 multidimensional 的剩余维度中的所有值。

dataSlice = cdfread("example_364.cdf","Variables","multidimensional", ...
                    "Slices",[0 1 1; 1 1 1; 0 2 2]);
dataSlice
dataSlice = 1x1 cell array
    {1x1x2x4 uint8}

或者,将整个变量读入 data,然后使用矩阵索引。

data = cdfread("example_364.cdf","Variables","multidimensional");
dataIndex = data{1}(1,2,[1 3],:);
whos dataIndex
  Name           Size               Bytes  Class    Attributes

  dataIndex      1x1x2x4                8  uint8              

折叠数据集中的记录,并将 CDF_EPOCHCDF_TIME_TT2000 数据类型转换为 MATLAB datetime 值。

data = cdfread("example_364.cdf","CombineRecords",true, ...
               "DatetimeType","datetime");
whos data
  Name      Size            Bytes  Class    Attributes

  data      1x8              7408  cell               

浏览 example_364.cdf 文件中的数据。

info = cdfinfo("example_364.cdf");
info.Variables
ans=8×6 cell array
    {'Time'            }    {[    1 1]}    {[24]}    {'epoch' }    {'T/'    }    {'Full'}
    {'Longitude'       }    {[    2 2]}    {[ 1]}    {'int8'  }    {'F/FT'  }    {'Full'}
    {'Latitude'        }    {[    2 2]}    {[ 1]}    {'int8'  }    {'F/TF'  }    {'Full'}
    {'Data'            }    {[  2 2 4]}    {[ 1]}    {'double'}    {'T/TTT' }    {'Full'}
    {'multidimensional'}    {[2 2 3 4]}    {[ 1]}    {'uint8' }    {'T/TTTT'}    {'Full'}
    {'Temperature'     }    {[    3 2]}    {[10]}    {'int16' }    {'T/TT'  }    {'Full'}
    {'multiInt8'       }    {[    2 3]}    {[ 2]}    {'int64' }    {'T/TT'  }    {'Full'}
    {'tt2000'          }    {[    1 1]}    {[ 8]}    {'tt2000'}    {'T/'    }    {'Full'}

读取 CDF_TIME_TT2000 数据。默认情况下,cdfread 将数据转换为 datetime 值。

tt2000Data = cdfread("example_364.cdf","Variables","tt2000");

检查第三个、第四个和第五个数据值。

tt2000Data{3:5}
ans = datetime
   2016-12-31T23:59:59.100200300Z

ans = datetime
   2016-12-31T23:59:60.100200300Z

ans = datetime
   2017-01-01T00:00:00.100200300Z

作为 CDF_TIME_TT2000 时间戳以本机形式读取 CDF_TIME_TT2000 数据。

tt2000Data = cdfread("example_364.cdf","Variables","tt2000", ...
                     "DatetimeType","native");

将数据分解为单独的时间分量。显示第三个、第四和第五个时间戳的分量。

timeArr = cdflib.breakdownTT2000([tt2000Data{:}]);
timeArr(:,3:5)
ans = 9×3

        2016        2016        2017
          12          12           1
          31          31           1
          23          23           0
          59          59           0
          59          60           0
         100         100         100
         200         200         200
         300         300         300

局限性

  • cdfread 函数不支持采用非 ASCII 字符编码的数据。CDF 文件中的所有变量名称、属性名称、变量值和属性值都必须采用 7 位 ASCII 编码。尝试读取采用非 ASCII 字符编码的文件将发生错误或者导致数据中包含损坏的字符。

版本历史记录

在 R2006a 之前推出

全部展开