当 ndims 在运行时变化时,如何在 julia 中使用 HDF5 编写块?

How to write chunks with HDF5 in julia when ndims can vary at runtime?

如果我有 1000 个 64x64 图像切片,我可以这样写 64x64x1 块:

using HDF5

filename = "test.h5"
# open file
fmode ="w"
# get a file object
fid = h5open(filename, fmode)
# matrix to write in chunks
B = rand(64,64,1000)
# figure out its dimensions
sizeTuple = size(B)
ndims = length(sizeTuple)
# set up to write in chunks of sizeArray
sizeArray = ones(Int, ndims)
[sizeArray[i] = sizeTuple[i] for i in 1:(ndims-1)] # last value of size  array is :...:,1
# create a dataset models within root
dset = d_create(fid, "models", datatype(Float64), dataspace(size(B)), "chunk", sizeArray)
[dset[:,:,i] = slicedim(B, ndims, i) for i in 1:size(B, ndims)]
close(fid)

这工作得很好,但 dset[:,:,i] 中的赋值语法特定于 ndims = 3。如果我在运行时指定了 1000 个任意超矩形切片,我该如何更改它?例如,对于 B = rand(64,64,3,1000) 或 rand(64,64,64,3,1000)?

谢谢

所以我在 Google 上的 julia 用户组得到了一些失败后的答案。非常简单:

    using HDF5

    filename = "test.h5"
    # open file
    fmode ="w"
    # get a file object
    fid = h5open(filename, fmode)
    # matrix to write in chunks
    B = rand(64,64,1000)
    # figure out its dimensions
    Ndims = ndims(B)
    # set up to write in chunks of sizeArray
    sizeArray = ones(Int, Ndims)
    [sizeArray[i] = size(B, i) for i in 1:(Ndims-1)] # last value of size array is :...:,1
    # create a dataset models within root
    dset = d_create(fid, "models", datatype(Float64), dataspace(size(B)), "chunk", sizeArray)
    # write in slices of (:,:,i) 
    [dset[(fill(:,Ndims-1))...,i] = slicedim(B, Ndims, i) for i in 1:size(B, Ndims)]
    close(fid)

fill 和 splat ... 语法非常非常有用。