支持H5属性中的基本数据类型?

时间:2014-06-18 10:10:01

标签: ilnumerics

我正在试用ilnumerics的beta hdf5工具包。

目前我看到H5Attributes仅支持ilnumerics数组。有没有计划将它作为最终版本的一部分扩展为基本数据类型(如字符串)?

ilnumerics H5包装器是否提供将任何功能扩展到特定的功能 数据类型?

2 个答案:

答案 0 :(得分:1)

当然,ILNumerics内部使用HDF集团的官方HDF5库。 HD5中的H5属性对应于数据集,其限制是不能进行部分I / O.除此之外,H5Attributes是普通的数组!通过假设存储的数组是标量来给出对基本(标量)元素类型的支持。

字符串是完全不同的故事:字符串通常是可变长度数据类型。就HDF5而言,字符串是元素类型Char的数组。字符串中的字符数决定了数组的长度。为了将字符串存储到数据集或属性中,您必须将其各个字符存储为数组的元素。在ILNumerics中,您可以将字符串转换为ILArrray或ILArray(对于ASCII数据)并将其存储到数据集/属性中。

请参考以下测试用例,该测试用例将字符串作为值存储到属性中,并将内容读回字符串。

免责声明:这是我们内部测试套件的一部分。您将无法直接编译示例,因为它取决于可能无法使用的多个函数的存在。但是,您将能够理解如何将字符串存储到数据集和属性中:

public void StringASCIAttribute() {
    string file = "deleteA0001.h5";
    string val = "This is a long string to be stored into an attribute.\r\n";
    // transfer string into ILArray<Char>
    ILArray<Char> A = ILMath.array<Char>(' ', 1, val.Length);
    for (int i = 0; i < val.Length; i++) {
        A.SetValue(val[i], 0, i);
    }
    // store the string as attribute of a group
    using (var f = new H5File(file)) {
        f.Add(new H5Group("grp1") {
            Attributes = { 
                { "title", A }
            }
        });
    }
    // check by reading back
    // read back 
    using (var f = new H5File(file)) {
        // must exist in the file
        Assert.IsTrue(f.Get<H5Group>("grp1").Attributes.ContainsKey("title"));
        // check size 
        var attr = f.Get<H5Group>("grp1").Attributes["title"];
        Assert.IsTrue(attr.Size == ILMath.size(1, val.Length));
        // read back 
        ILArray<Char> titleChar = attr.Get<Char>();
        ILArray<byte> titleByte = attr.Get<byte>();

        // compare byte values (sum) 
        int origsum = 0;
        foreach (var c in val) origsum += (Byte)c;
        Assert.IsTrue(ILMath.sumall(ILMath.toint32(titleByte)) == origsum);

        StringBuilder title = new StringBuilder(attr.Size[1]);
        for (int i = 0; i < titleChar.Length; i++) {
            title.Append(titleChar.GetValue(i));
        }
        Assert.IsTrue(title.ToString() == val);
    }
}

这将任意字符串作为'Char-array'存储到HDF5属性中,并且对于H5Dataset也可以使用相同的字符串。

HDF5 objects Visual Studio Inspection

答案 1 :(得分:0)

作为替代解决方案,您可以使用HDF5DotNet(http://hdf5.net/default.aspx)包装器将属性写为字符串:

H5.open()
Uri destination = new Uri(@"C:\yourFileLocation\FileName.h5");
//Create an HDF5 file
H5FileId fileId = H5F.create(destination.LocalPath, H5F.CreateMode.ACC_TRUNC);
//Add a group to the file
H5GroupId groupId = H5G.create(fileId, "groupName");

string myString = "String attribute";
byte[] attrData = Encoding.ASCII.GetBytes(myString);

//Create an attribute of type STRING attached to the group
H5AttributeId attrId = H5A.create(groupId, "attributeName", H5T.create(H5T.CreateClass.STRING, attrData.Length),
               H5S.create(H5S.H5SClass.SCALAR));
//Write the string into the attribute
H5A.write(attributeId, H5T.create(H5T.CreateClass.STRING, attrData.Length), new H5Array<byte>(attrData));

H5A.close(attributeId);
H5G.close(groupId);
H5F.close(fileId);
H5.close();