亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 GO 語言讀取可能是兩種不同數據類型之一的 HDF5 屬性?

如何使用 GO 語言讀取可能是兩種不同數據類型之一的 HDF5 屬性?

Go
至尊寶的傳說 2023-06-12 09:50:29
作為評估項目的一部分,我正在將現有的 C++ 應用程序移植到 GO。作為其中的一部分,我需要讀取兩個數據集屬性,這些屬性在一些文件中存儲為雙精度,在一些文件中存儲為浮點數。我用來處理這個問題的 C++ 代碼如下所示(我們在 Debian Linux 上使用 libhdf5-cpp-100)。const auto att = dataSet.openAttribute(attributeName);if (att.getDataType() == H5::PredType::NATIVE_DOUBLE) {    att.read(att.getDataType(), &attributeValue);}else if (att.getDataType() == H5::PredType::NATIVE_FLOAT) {    float temp = 0.F;    att.read(att.getDataType(), &temp);    attributeValue = static_cast<double>(temp);}else {    // we throw an exception indicating we don't support the type}我的問題是我無法在 GO 中編寫等效項。(我正在使用包“gonum.org/v1/hdf5”。)讀取方法似乎很簡單:func (s *Attribute) Read(data interface{}, dtype *Datatype) error但是我正在努力確定要傳遞什么作為數據類型,因為屬性類型似乎沒有 GetDataType 方法。我看到的最接近的是:func (s *Attribute) GetType() Identifier但這不返回數據類型,它返回一個標識符。我在假設給定標識符我可以確定數據類型的情況下嘗試了以下比較:if attr.GetType().ID() == hdf5.T_NATIVE_DOUBLE.ID() {    // handle as a double}但這是行不通的。從 GetType() 返回的 ID 與雙精度型或浮點型的 ID 不同。我已經瀏覽過在線文檔,https://godoc.org/gonum.org/v1/hdf5但無法找到解決我的問題的方法。(或使用 GO 讀取 HDF5 屬性的任何示例。)有沒有人設法做這樣的事情?還是大多數示例只是假定類型而不是查詢類型?
查看完整描述

1 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

我已經證實了我的懷疑,現在有了正確的答案。根本問題是我在使用 C++ API 時出錯(在某些情況下這會導致只寫 1/2 的雙精度數),而我實際上是在嘗試在 GO 中重復這個錯誤。其實解決方法很簡單。


傳遞到屬性方法中的屬性類型read不是屬性的類型,而是存儲在內存中時您希望將其轉換為的類型。這意味著我的 C++ 代碼應該簡單得多,因為不需要檢查屬性類型,也不需要檢查static_cast結果。要讀取和存儲屬性值,依靠 HDF5 執行轉換并在屬性不可轉換為雙精度值時拋出合適的異常,非常簡單


const auto att = dataSet.openAttribute("my attribute name");

att.read(H5::PredType::NATIVE_DOUBLE, &attributeValue);

GO 版本的工作量更大,因為我們必須手動管理對象生命周期和錯誤條件,但就在這里。(請注意,我假設“...處理錯誤...”也涉及提前退出,否則需要額外的 if 語句來檢查 att 是否為 nil。)


att, err := dataSet.OpenAttribute("my attribute name")

if err != nil {

    ...handle the error...

}


err = att.Read(&attributeValue, hdf5.T_NATIVE_DOUBLE)

if err != nil {

    ...handle the error...

}


err = att.Close()

if err != nil {

    ...handle the error...

}


查看完整回答
反對 回復 2023-06-12
  • 1 回答
  • 0 關注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號