あなたは正しいです、テンソルlhs [0]は1次元ですが、最初に質問に答えるために、ボンネットの下で何が起こっているかを見せてください。 TensorContainerは[]演算子をオーバーライドしない代わりに、それは(テンソルである)親からの1つを使用して、より正確following oneが呼び出され:
MSHADOW_XINLINE Tensor<Device, kSubdim, DType> operator[](index_t idx) const {
return Tensor<Device, kSubdim, DType>(dptr_ + this->MemSize<1>() * idx,
shape_.SubShape(), stride_, stream_);
}
それはスタック上に新しいテンソルを作成分かるようにそして、大部分のケースでは汎用N-dimensional Tensorが作成されますが、ここでは1次元の場合は1-dimensional Tensorという特別なものが作成されます。
今、私たちは[]演算子によって返されるまさに確立したとき、のは、そのクラスのフィールドに見てみましょう:ここshape_のみ1寸法を有する見ることができます
DType *dptr_;
Shape<1> shape_;
index_t stride_;
のよう!だからshape_ 1がなく、代わりにshape_ 1を呼び出すことによって、stride_(またはその一部)が返されます。ここでは、実行して、実際にそこに何が起こっているかを確認するために試みることができるテンソルコンストラクタに変更されます。
MSHADOW_XINLINE Tensor(DType *dptr, Shape<1> shape,
index_t stride, Stream<Device> *stream)
: dptr_(dptr), shape_(shape), stride_(stride), stream_(stream) {
std::cout << "shape[0]: " << shape[0] << std::endl; // 3
std::cout << "shape[1]: " << shape[1] << std::endl; // 0, as expected
std::cout << "_shape[0]: " << shape_[0] << std::endl; // 3, as expected
std::cout << "_shape[1]: " << shape_[1] << std::endl; // garbage (4)
std::cout << "address of _shape[1]: " << &(shape_[1]) << std::endl;
std::cout << "address of stride: " << &(stride_) << std::endl;
}
と出力:
shape[0]: 3
shape[1]: 0
_shape[0]: 3
_shape[1]: 4
address of _shape[1]: 0x7fffa28ec44c
address of stride: 0x7fffa28ec44c
_shape 1とストライドが同じアドレスの両方を持っています(0x7fffa28ec44c)。
鮮やかな答え!どうもありがとう! –
@ROBOTAIこれが正しい答えだと思うなら、それを正しいとマークするように頼んでもいいですか? –