【问题标题】:How do I resize an array in an already populated netcdf file with Matlab?如何使用 Matlab 在已填充的 netcdf 文件中调整数组的大小?
【发布时间】:2015-02-21 17:55:10
【问题描述】:

假设我有一个包含大量变量的 netcdf 文件,其中一个名为“时间”,大小为 500。

nc=netcdf(ncfile, 'write')
size(nc{'time'})
ans =
500

现在我想在同一个变量中存储更长的时间序列(比如 750 个成员),但我想保持文件的其余部分相同。如何将此变量的维度更改为 750,同时保持 netcdf 文件中的其余变量不变?

我尝试简单地附加到数组中,没有出现错误,但数组大小没有改变(这意味着它根本不写入值)

nc{'time'}(750)=1

我尝试写一个我尝试将文件置于重新定义模式并更改大小,但无法更改现有变量。

dimid=netcdf.defDim(ncid,'time',750)

Error using netcdflib
The NetCDF library encountered an error during execution of 'defDim' function - 'String match to
name in use (NC_ENAMEINUSE)'.

我无法想象它做起来太难了,但我很惊讶它并不像我想象的那么容易。有什么建议?我错过了什么?

【问题讨论】:

    标签: matlab netcdf


    【解决方案1】:

    NetCDF 允许维度为固定长度或无限长度。您不能真正“调整”现有 netcdf 文件数组的大小。您只能追加到现有 UNLIMITED 维度的末尾或创建新文件。因此,首先检查您的 netcdf 文件是否具有 UNLIMITED 时间维度。您可以通过以下方式在 Matlab 中检查:

    ncid = netcdf.open('myfile.nc','WRITE');
    dimids = netcdf.inqUnlimDims(ncid)
    

    如果dimids 为空或不包含时间,您将必须创建一个具有无限时间维度的新文件并将数据复制到其中。

    如果dimids 包含时间维度,那么您可以简单地将数据写入其中。例如,如果当前时间值的数量为 500,但您想在索引 750 处写入时间值 23.5,则只需:

    timeid = netcdf.inqVarID(ncid,'time')
    [varname, xtype, dimids, natts] = netcdf.inqVar(ncid,timeid)
    netcdf.putVar(ncid,timeid,750,1,23.5)
    netcdf.close(ncid)
    

    那是 UNLIMITED,目前有 500 条记录,但你想写到 750 条记录,你可以继续写。

    【讨论】:

    • 是的,这是问题的一部分。没有无限的维度。我也在 UniData 网页上找到了答案:“名称可能稍后更改,但如果不将所有数据复制到具有重新定义的维度大小的新 netCDF 文件,则无法更改维度的大小”。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2012-03-04
    • 2023-03-16
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多