我有(初始化的)張量input
並且想要直接使用指針訪問數據。我使用訪問張量流張量數據時的分割錯誤(在C++中)
float *input_ptr = input.flat<float>().data();
當我試圖訪問數據,例如,通過使用:
input_ptr[0]
它會導致分段錯誤,但我不明白爲什麼。
根據該C++ API:
平()
返回的張量數據作爲本徵::張量數據類型的與指定的形狀。
這些方法允許您訪問您選擇的尺寸和大小的數據。您不需要知道張量的維數來調用它們。然而,他們檢查類型是否匹配,並且要求的尺寸創建了一個Eigen :: Tensor,其張量與元素數量相同。'
這使我得到特徵張量。現在,根據本徵文檔:
數據()
將指針返回到該存儲的張量。如果張量爲常量,則指針爲常量。這允許直接訪問數據。數據的佈局取決於張量佈局:RowMajor或ColMajor。
例子:
Eigen::Tensor<float, 2> a(3, 4);
float* a_data = a.data();
>a_data[0] = 123.45f;
>cout << "a(0, 0): " << a(0, 0);
>=> a(0, 0): 123.45
所以,就我所知道的,我應該能夠使用input_ptr
沒有問題。 (值得注意的是指針確實指向了一個有效的位置,例如,我可以使用cudaMemcpy
成功地將其內容複製到設備數組中,所以問題必須是我不允許訪問數據的位置,我只是不明白爲什麼。)
任何想法,將不勝感激。
這是一個好主意,檢查使用前的指針.. – Zakir
公平不夠,我忽視這樣做。 (雖然,如上所述,在這種特定情況下,我知道指針不爲空。) – Dealan