Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

cdfread

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

语法

data = cdfread(filename)
data = cdfread(filename,param1,val1,param2,val2,...)
[data,info] = cdfread(filename,...)

说明

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

注意

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

data = cdfread(filename,param1,val1,param2,val2,...) 读取文件中的数据,其中 param1param2 等可以是下表中列出的任何参数。

[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' 参数结合使用。

"ConvertEpochToDatenum"

一个布尔值,确定 cdfread 是否自动将 CDF 纪元数据类型转换为 MATLAB® 日期序列值。如果设置为 false(默认值),则 cdfread 会将纪元值包含于 MATLAB cdfepoch 对象中。

注意:要在读取大型数据集时获得更好的性能,请将此参数设置为 true

注意:如果使用 "ConvertEpochToDatenum" 参数,则无法使用 "DatetimeType" 参数。

"DatetimeType"

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

注意:如果使用 "DatetimeType" 参数,则无法使用 "ConvertEpochToDatenum" 参数。

"CombineRecords"

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

注意:如果您使用 "Records" 参数指定要读取的记录,则不能使用 "CombineRecords" 参数。

注意:使用 "Variable" 参数读取一个变量时,如果 "CombineRecords" 参数为 truecdfread 将以 m×n 数值或字符数组形式返回数据,而不是将数据置于元胞数组中。

注意

要改善使用大型数据文件时的性能,可使用 "ConvertEpochToDatenum""CombineRecords" 选项。

注意

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

示例

全部折叠

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

data = cdfread("example.cdf");

从 CDF 变量 'Time' 中读取数据。

data = cdfread("example.cdf","Variable",{"Time"});

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

data = cdfread("example.cdf","Variable",{'multidimensional'},"Slices", [0 1 1; 1 1 1; 0 2 2]);

这类似于将整个变量读取到 data 中,然后使用矩阵索引。

data = cdfread("example.cdf","Variable",{'multidimensional'});
data{1}(1,2,[1 3],:);

折叠数据集中的记录,然后将 CDF 纪元数据类型转换为 MATLAB 日期序列值。

data = cdfread("example.cdf","CombineRecords",true,"ConvertEpochToDatenum",true);

此示例说明如何使用 cdfread 来读取 CDF_TIME_TT2000 数据。

浏览示例 CDF 文件中的数据。

info = cdfinfo("example_364.cdf");
info.Variables
ans=8×6 cell array
  Columns 1 through 5

    {'Time'            }    {[    1 1]}    {[24]}    {'epoch' }    {'T/'    }
    {'Longitude'       }    {[    2 2]}    {[ 1]}    {'int8'  }    {'F/FT'  }
    {'Latitude'        }    {[    2 2]}    {[ 1]}    {'int8'  }    {'F/TF'  }
    {'Data'            }    {[  2 2 4]}    {[ 1]}    {'double'}    {'T/TTT' }
    {'multidimensional'}    {[2 2 3 4]}    {[ 1]}    {'uint8' }    {'T/TTTT'}
    {'Temperature'     }    {[    3 2]}    {[10]}    {'int16' }    {'T/TT'  }
    {'multiInt8'       }    {[    2 3]}    {[ 2]}    {'int64' }    {'T/TT'  }
    {'tt2000'          }    {[    1 1]}    {[ 8]}    {'tt2000'}    {'T/'    }

  Column 6

    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}

读取 CDF_TIME_TT2000 数据,并检查第三、第四和第五个条目。

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

此示例说明如何使用 cdfread 以本机形式读取 CDF_TIME_TT2000 数据作为 CDF_TIME_TT2000 时间戳,然后将这些时间戳分解为单独的时间分量。

浏览示例 CDF 文件中的数据。

info = cdfinfo("example_364.cdf");
info.Variables
ans=8×6 cell array
  Columns 1 through 5

    {'Time'            }    {[    1 1]}    {[24]}    {'epoch' }    {'T/'    }
    {'Longitude'       }    {[    2 2]}    {[ 1]}    {'int8'  }    {'F/FT'  }
    {'Latitude'        }    {[    2 2]}    {[ 1]}    {'int8'  }    {'F/TF'  }
    {'Data'            }    {[  2 2 4]}    {[ 1]}    {'double'}    {'T/TTT' }
    {'multidimensional'}    {[2 2 3 4]}    {[ 1]}    {'uint8' }    {'T/TTTT'}
    {'Temperature'     }    {[    3 2]}    {[10]}    {'int16' }    {'T/TT'  }
    {'multiInt8'       }    {[    2 3]}    {[ 2]}    {'int64' }    {'T/TT'  }
    {'tt2000'          }    {[    1 1]}    {[ 8]}    {'tt2000'}    {'T/'    }

  Column 6

    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}
    {'Full'}

以本机形式读取 CDF_TIME_TT2000 数据,并将数据分解为单独的时间分量。

tt2000Data = cdfread("example_364.cdf","Variables","tt2000","DateTimeType","native");
timeArr = cdflib.breakdownTT2000([tt2000Data{:}])
timeArr = 9×8

        2016        2016        2016        2016        2017        2017        2017        2017
          12          12          12          12           1           1           1           1
          31          31          31          31           1           1           1           1
          23          23          23          23           0           0           0           0
          59          59          59          59           0           0           0           0
          57          58          59          60           0           1           2           3
         100         100         100         100         100         100         100         100
         200         200         200         200         200         200         200         200
         300         300         300         300         300         300         300         300

局限性

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

版本历史记录

在 R2006a 之前推出

全部展开