我正在试用ilnumerics的beta hdf5工具包。
目前我看到H5Attributes仅支持ilnumerics数组。有没有计划将它作为最终版本的一部分扩展为基本数据类型(如字符串)?
ilnumerics H5包装器是否提供将任何功能扩展到特定的功能 数据类型?
答案 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也可以使用相同的字符串。
答案 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();