- 博客(261)
- 收藏
- 关注

原创 一個Tensor的一生 - torch.rand篇
Life of a Tensor這篇文章中介紹了torch.rand函數從Python API一直到C++底層的調用過程,寫於2019年7月,當時的PyTorch版本為1.1.0。參考該篇文章,本篇的關注點同樣在整個調用流程,不過是基於較新的PyTorch 2.0版。
2023-12-05 22:43:48
952

原创 torch::和at:: factory function的差別
在這兩個例子中,torch.rand factory function會根據requires_grad參數生成一個可微或不可微的張量。深入其C++底層,會發現它們調用的其實是torch::和at::兩個不同命名空間裡的factory function,本篇將會通過查看源碼和範例程序來了解不同factory function生成的張量有何差別。
2023-11-28 21:50:02
1284

原创 P3P Kneip - A Novel Parametrization of the Perspective-Three-Point Problem for a Direct Computation
Perspective-Three-Point (P3P)問題的目標是在已知P1,P2,P3三個三維點和對應的二維點的情況下,求解相機的外參R與t。本篇論文提出了一種直接計算P3P問題closed-form solution的算法。本文為Kneip論文裡第二章Theory的筆記,著重於補全論文裡省略的公式推導。
2021-02-24 21:48:35
663
原创 C++中的List-initialization
摘要:C++11引入的列表初始化(List-initialization)通过大括号{}语法初始化对象,分为直接列表初始化和复制列表初始化两种形式。直接列表初始化适用于变量声明、临时对象、动态分配对象等场景,而复制列表初始化则用于等号赋值、函数参数传递等场合。C++20进一步扩展了语法,支持指定初始化器。该特性同时考虑显式和非显式构造函数,但复制列表初始化仅能调用非显式构造函数。列表初始化提供了更统一、安全的初始化方式,避免了传统初始化可能带来的歧义问题。
2025-10-16 09:54:25
755
原创 C++中的initializer_list
C++11引入了std::initializer_list,用于表示由大括号包围的初始化列表。它本质上是一个轻量级代理对象,包含指向常量数组的指针和长度信息。编译器会在以下情况自动构造该对象:1)列表初始化对象时;2)作为赋值或函数调用的右操作数时;3)绑定给auto变量时。initializer_list的实现通常采用指针和长度组合,仅提供只读访问,不负责内存管理。其成员类型包括value_type、iterator等,主要提供size()、begin()、end()等基本操作接口。
2025-09-23 13:52:06
980
原创 Python中的PyObject和pybind11中的handle, object
Python中的PyObject是所有对象类型的基类,包含引用计数和类型信息,通常通过宏访问其成员。pybind11中的handle和object是对PyObject*的封装,继承自object_api类,提供了操作Python对象的通用方法,如迭代、属性访问、函数调用等。object_api是一个模板类,要求派生类实现ptr()方法返回PyObject*,支持类似Python的操作语法,如[]索引、attr()属性访问和operator()函数调用。
2025-09-18 09:21:23
778
原创 pybind11中的reinterpret_borrow和reinterpret_steal
pybind11中的reinterpret_borrow和reinterpret_steal都用于将PyObject*或handle包装成py::object,主要区别在于引用计数处理方式。reinterpret_borrow会临时增加引用计数,确保对象在包装期间不被释放,使用后归还引用;而reinterpret_steal直接窃取对象所有权,不增加引用计数,包装对象销毁时会释放该引用。测试代码显示:borrow操作后引用计数恢复为1,steal操作后引用计数归零。应根据所有权需求选择合适方法,创建新对象时
2025-09-17 09:19:16
328
原创 Python中的getattr/setattr和pybind11中的attr相關函數
本文介绍了Python内置函数getattr和setattr的用法及其在pybind11中的实现。getattr用于获取对象属性值,可设置默认返回值;setattr则为对象设置属性值。两者都支持非标准标识符的属性名,但需注意私有属性名称在编译期会被改写(mangling)。文中通过Python示例展示了基本用法,并演示了在pybind11中如何通过C++接口调用这些功能,实现Python与C++间的属性交互。pybind11的函数行为与Python原生函数一致,提供了跨语言操作的便捷性。
2025-09-10 23:07:26
828
原创 PyTorch中的c10::ArrayRef和at::IntArrayRef
PyTorch中的c10::ArrayRef和at::IntArrayRef用于表示对数组的常量引用。c10::ArrayRef是一个通用模板类,提供对连续内存中元素的轻量级引用,支持多种初始化方式(如指针+长度、容器、数组等)。它不拥有数据所有权,仅作为访问接口,包含迭代器、大小查询等基本操作。at::IntArrayRef是特化版本,专用于整数数组,常用于张量形状参数(如torch.empty(3,4))。两者均通过指针和长度高效传递数据,避免拷贝开销。
2025-08-20 09:14:45
1017
原创 Fanuc RoboGuide修改手臂控制器埠號port number
本文介绍了在Fanuc RoboGuide中查看和修改机器人控制器端口号的方法。通过右击控制器可查看当前端口号但无法直接修改。需在My Workcells目录下找到对应机器人的services.txt文件,关闭RoboGuide后手动修改其中的Robot IF Server"(TCP端口)和Robot Discovery Method(UDP端口)数值。默认TCP端口为60008,该端口需保持可访问状态。修改完成后重新启动RoboGuid
2025-08-12 15:44:57
392
原创 PyTorch中的STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA和STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA
PyTorch中STATIC_CONSTEXPR_STR_INL_EXCEPT_WIN_CUDA和STATIC_CONST_STR_OUT_OF_LINE_FOR_WIN_CUDA宏用于处理不同平台下静态常量字符串的定义问题。在非Windows NVCC平台(如Linux/非CUDA环境)下,这些宏直接将字符串定义为static constexpr成员;而在Windows NVCC平台下,由于编译器限制,需要将声明和定义分开处理:先在类内声明static const成员,然后在类外单独定义并初始化。这种设计
2023-11-30 15:35:46
648
原创 PyTorch中的intrusive_ptr
intrusive_ptr與unique_ptr,shared_ptr等一樣,都是smart pointer。但是intrusive_ptr比較特別,它所指向的物件類型必須繼承自intrusive_ptr_target,而intrusive_ptr_target必須實現引用計數相關的函數才行。在PyTorch中,StorageImpl繼承自c10::intrusive_ptr_target,所以c10::intrusive_ptr可以與StorageImpl搭配使用。
2023-10-24 22:23:22
1536
1
原创 Python GIL及其釋放/獲取函數
Python默認使用CPython解釋器,當中會引入GIL,在CPython解釋器中,GIL(全局解釋器鎖)是一個互斥鎖,用於保護Python物件,避免它們在多線程執行被同時存取。多線程程式花了很多時間在GIL裡,解釋CPython bytecode,這時候GIL的存在便使得多線程程式無法充份利用多核系統。還好pybind11有提供釋放GIL的機制,pybind11提供了釋放和重新獲取GIL的API,即gil_scoped_release和gil_scoped_acquire這兩個類別,可以利用這兩個API
2023-10-12 10:27:12
1242
原创 PyTorch中的pyi檔案生成機制
在PyTorch中如果查找python函數的定義,十有八九會跳轉到torch/_C/_VariableFunctions.pyi這個檔案。但是如果去PyTorch的github repo上尋找這個檔案,只能找到一個跟它名字類似的torch/_C/_VariableFunctions.pyi.in,卻找不到torch/_C/_VariableFunctions.pyi這個檔案本身。
2023-09-20 13:34:59
1655
原创 PyTorch中的python_torch_functions_i.cpp檔案生成機制
編譯PyTorch後,torch/csrc/autograd/generated/目錄下會有python_torch_functions_0.cpp,python_torch_functions_1.cpp和python_torch_functions_2.cpp等檔案,本文便從setup.py依次來探討這些檔案是如何生成的。
2023-09-09 23:06:14
976
原创 撰寫自己的Python C擴展!
本篇為Extending and Embedding the Python Interpreter系列第一篇1. Extending Python with C or C++的學習筆記。Python平易近人但效率較差,所以有時候我們會希望能用C語言實作某些功能,再由Python端調用。舉個例子,假設我們想要寫一個名為spam的Python包,並透過以下方式調用
2023-09-07 10:51:54
355
原创 Python/C API - 模組,型別,Tuple,例外和引用計數
本文介紹在寫Python的C擴展時常用到的Python/C API中關於模組,型別,Tuple,例外和引用計數的函數。
2023-09-07 10:43:29
557
原创 cmake的add_custom_command及add_custom_target
在編譯的C++專案的過程中難免會需要對檔案或資料夾做複製,刪除,移動等操作。cmake這個編譯工具便提供了一種機制,讓使用者可以在編譯的過程插入欲執行的命令。具體方式是在中使用及。本文給出使用添加並執行命令的方式,以及使用的二種等價寫法。在正式進入之前,建議先了解一下cmake -E命令行工具。cmake -E除了可以在命令行中使用,在中,也可以通過及這兩個指令來呼叫執行。
2023-09-05 16:03:52
943
原创 PY_SSIZE_T_CLEAN macro的作用
Extending Python with C or C++中介紹了Python的C extension的寫法,它給出的範例前兩行如下:其中的作用為何?簡單來說是讓用於解析extensions functions/methods參數的函數把的長度參數當成而非型別。參考Parsing arguments and building values - Strings and buffers,的有兩個參數:分別代表字串本身及其長度,其中長度的型別必須是。根據以下說明:可以知道長度參數的型別預設是,如果定義了,
2023-09-04 17:37:03
1275
原创 Python flags: --cflags, --includes, --ldflags, --libs
Python flags: --cflags, --includes, --ldflags, --libs。
2023-09-04 17:24:00
466
原创 cmake -E 命令行工具
cmake這個編譯工具提供了執行指令的功能,只要在cmake之後加上-E及欲執行的命令即可。注意cmake支援的命令與linux不完全相通,在使用之前建議先前往查詢用法。幾個常用指令的demo如下。
2023-09-03 20:59:10
600
原创 PyTorch檔案生成機制中的FileManager.write_with_template
PyTorch中有些檔案是在編譯過程中跑腳本生成的,如.pyi檔是由.pyi.in檔生成,torch/csrc/autograd/generated目錄下的.cpp檔則是由tools/autograd/templates下的template .cpp檔生成的。
2023-08-31 11:49:31
740
原创 Python typing函式庫和torch.types
在PyTorch中的Sequence, Iterable, Optional, Union都是什麼意思呢?他們是從一個叫做typing的庫中導入的。typing是Python的標準庫之一,作用是提供對類型提示的運行時支持。
2023-08-20 21:41:52
798
原创 在Ubuntu中安裝Anaconda
在Ubuntu下安裝Anaconda很簡單,基本上只要照著Anaconda documentation - Installing on Linux裡的步驟做即可。
2022-11-06 20:17:40
1749
原创 Generalized-ICP(GICP)論文研讀
ICP最基本的形式是point-to-point,即以點到點之間的距離作為損失函數;它的一個變種是point-to-plane,改用點到目標點局部擬合平面的距離作為損失函數。本篇介紹的GICP是上述兩者的generalization,它重新定義了自己的損失函數。point-to-point,point-to-plane,甚至plane-to-plane都可以用GICP這個統一的框架表達。
2022-02-09 10:19:32
4627
9
原创 兩獨立高斯隨機變數之和
兩獨立高斯隨機變數之和以下證明參考Sum of normally distributed random variables - Proof using characteristic functions。兩個隨機變數X,YX,YX,Y的特徵函數定義如下:φX(t)=E(eitX),φY(t)=E(eitY)\varphi_X (t) = \operatorname{E}\left(e^{itX}\right), \qquad \varphi_Y(t) = \operatorname{E}\left(
2022-02-08 15:20:08
2423
原创 兩獨立隨機變數之和的特徵函數
兩獨立隨機變數之和的特徵函數參考機率論 特性函數(1) - Properties,特徵函數(characteristic function)的定義為:φX(t)=E(eit(X))\varphi_{X}(t)=\operatorname{E}\left(e^{it(X)}\right)φX(t)=E(eit(X))。φX+Y(t)=E(eit(X+Y))套用特徵函數的定義=E(eit(X))E(eit(Y))假設有兩獨立的隨機變數X,Y,則E(XY)=E(X)E(Y)=φX(t)φY(t
2022-02-08 14:44:13
1103
原创 兩隨機變數乘積的期望值
兩隨機變數乘積的期望值以下推導參考Distribution of the product of two random variables - Expectation of product of random variables。E(XY)=E(E(XY∣Y))law of total expectation=E(Y⋅E[X∣Y])外層給定Y=y,所以Y對內層期望值來說為常數\begin{aligned} \operatorname{E}(XY) &= \o
2022-02-08 14:40:08
3177
原创 Law of total expectation證明
Law of total expectation證明Law of total expectation的公式為:E(X)=E(E(X∣Y))\operatorname{E} (X) = \operatorname{E} \left( \operatorname{E} (X \mid Y) \right)E(X)=E(E(X∣Y))參考Law of total expectation - Proof in the finite and countable cases,證明如下:E(E(X∣Y)
2022-02-08 14:29:12
1649
原创 對隨機變數做線性變換後的期望值和協方差
對隨機變數做線性變換後的期望值和協方差假設X,b∈Rn,A∈Rm×n\textbf{X},b \in \R^n, A \in R^{m \times n}X,b∈Rn,A∈Rm×n,那麼使用A,bA,bA,b對X\textbf{X}X做線性變換後,其期望值如下:E[AX]=AE[X]\operatorname{E}[A\textbf{X}] =A \operatorname{E}[\textbf{X}]E[AX]=AE[X]E[X+b]=E[X]+bE是線性算子\begin{aligned}
2022-02-08 14:27:49
1366
原创 PCL - ICP代碼研讀(二七) - TransformationEstimationPointToPlaneLLS實現
TransformationEstimationPointToPlaneLLS類別中有五個estimateRigidTransformation函數,其中四個是public的,另一個是protected的。前四個public的estimateRigidTransformation都是protected的estimateRigidTransformation的wrapper。
2021-10-24 10:01:36
1284
原创 PCL - ICP代碼研讀(二六) - TransformationEstimationPointToPlaneLLS架構
ICP的變種Point-To-Plane相較於經典款的ICP,損失函數由兩點間的距離變成source點到target點法向量所定義平面的距離,其推導詳見ICP變種Point-To-Plane算法推導。PCL中的TransformationEstimationPointToPlaneLLS便是Point-To-Plane ICP算法的具體實現。TransformationEstimationPointToPlaneLLS是TransformationEstimation的子類別,提供了estimateRi
2021-10-24 10:00:02
1455
原创 ICP變種Point-To-Plane算法推導
接續ICP(Iterative Closest Point)算法推導,本篇介紹ICP的變種Point-To-Plane損失函數及其求解方法。本文同樣整理自深藍學院三維點雲處理課程的Lecture 9 – Registration。
2021-10-21 10:06:59
2928
原创 Linux(docker)下使用VSCode運行C++專案
在網上找過一些使用VSCode運行C++專案的文章,發現大多數文章起手就是launch.json,settings.json和tasks.json。但如果只想編譯現成的C++專案,可以不用這麼複雜,基本上按照官方教學來做即可。
2021-10-15 22:44:42
1260
原创 透過Certbot為Apache網站更新憑證 - HTTP-01 考驗
之前寫過一篇透過Certbot為Apache網站申請憑證,本篇記錄更新憑證時所踩過的坑及解決方式。
2021-10-13 14:34:30
6728
1
原创 PCL - ICP代碼研讀(二五 ) - DefaultConvergenceCriteria實現
接續PCL - ICP代碼研讀(二四 ) - DefaultConvergenceCriteria架構,本篇繼續介紹DefaultConvergenceCriteria中hasConverged函數的實現。本篇對應到default_convergence_criteria.hpp這個檔案。
2021-10-12 23:16:47
942
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人