自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 Postgresql導出及導入符合條件的記錄

Postgresql導出及導入符合條件的記錄

2025-03-28 09:33:30 316

原创 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下設定Redmine備份

Ubuntu下設定Redmine備份

2022-12-07 15:05:23 1563

原创 在Ubuntu中安裝Anaconda

在Ubuntu下安裝Anaconda很簡單,基本上只要照著Anaconda documentation - Installing on Linux裡的步驟做即可。

2022-11-06 20:17:40 1749

原创 redmine插件安裝及卸載

本文介紹redmine插件安裝及卸載的方式

2022-06-06 10:16:06 1986 2

原创 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下編譯安裝PyTorch源碼

本篇記錄在Linux下編譯安裝PyTorch源碼的流程,以及編譯過程中電腦當機的解決方式。

2021-10-16 17:14:08 1849 3

原创 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关注的人

提示
确定要删除当前文章?
取消 删除