You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tensor.cc 2.9 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "tensor.h"
  2. namespace tensor {
  3. std::shared_ptr<Tensor> Tensor::transpose() {
  4. // 放心,下面的代码暂时不会被触发,我们假定所有的tensor都是2维的
  5. // if (shape.size() != 2) {
  6. // throw std::runtime_error("Transpose is only supported for 2D tensors.");
  7. // }
  8. // 这里能够获得矩阵的行数和列数,但是我们是使用一个一维的vector来存储数据的。该如何实现“转置”呢?
  9. std::size_t rows = shape[0];
  10. std::size_t cols = shape[1];
  11. std::vector<size_t> new_shape = {cols, rows};
  12. // 你知道这里的size变量在哪里定义的吗?在VSCode里面安装C/C++ Extension Pack后,按下ctrl键并单击变量size,VSCode就会把你导向定义这个变量的地方!
  13. std::vector<float> transposed_data(size);
  14. // 请在这里写转置的代码
  15. // 请阅读关于Tensor的定义,在这里创建一个新的Tensor
  16. // 注意,要使用shared_ptr哦!
  17. return std::make_shared<Tensor>(new_shape);
  18. }
  19. std::shared_ptr<Tensor> pyarray_to_tensor(py::array_t<float> array) {
  20. py::buffer_info info = array.request();
  21. float* dataPtr = static_cast<float*>(info.ptr);
  22. std::vector<std::size_t> shape = {};
  23. for (auto &it: info.shape) {
  24. shape.push_back(it);
  25. }
  26. auto tensor = std::make_shared<Tensor>(shape);
  27. std::vector<float> result(dataPtr, dataPtr + info.size);
  28. tensor->data = result;
  29. return tensor;
  30. }
  31. std::shared_ptr<Tensor> argmax(const std::shared_ptr<Tensor>& tensor, int axis) {
  32. // you only need to handle the two dimensional tensor, and the axis can be either 0 or 1
  33. // the tensor's shape is (batch_size, features)
  34. // if the axis is 0, it outputs a tensor (1, features)
  35. // if the axis is 1, it outputs a tensor (batch_size, 1)
  36. // compute the output's shape
  37. std::vector<std::size_t> output_shape = tensor->shape;
  38. output_shape.erase(output_shape.begin() + axis);
  39. auto result = std::make_shared<Tensor>(output_shape);
  40. // 这个问题似乎有点难,所以我们决定给你送点分。一个简单的办法是分axis为0还是为1来进行讨论,反正我们已经把问题简化为了,在一个二维的tensor里面,找到每一行或者每一列的最大值,并输出一个一维的tensor。
  41. // 补全这里的代码。
  42. return result;
  43. }
  44. std::shared_ptr<Tensor> mean(const std::shared_ptr<Tensor>& tensor) {
  45. std::vector<std::size_t> shape = {1};
  46. auto result = std::make_shared<Tensor>(shape);
  47. auto sum = 0.0f;
  48. for (auto &it: tensor->data) {
  49. sum += it;
  50. }
  51. sum /= tensor->size;
  52. result->data[0] = sum;
  53. return result;
  54. }
  55. std::shared_ptr<Tensor> exp(const std::shared_ptr<Tensor>& tensor) {
  56. auto result = std::make_shared<Tensor>(tensor->shape);
  57. for (auto i = 0; i < tensor->size; i++) {
  58. result->data[i] = expf(tensor->data[i]);
  59. }
  60. return result;
  61. }
  62. }

计算机大作业

Contributors (1)