從零Makefile落地算法大項目,完整案例教程

從零Makefile落地算法大項目,完整案例教程

轉自:從零Makefile落地算法大項目,完整案例教程

作者:手寫AI

前言

  1. 在這里,你能學到基于Makefile的正式大項目的使用方式和考慮,相信我,其實可以很簡單。而且寫一次到處用,新項目復制即可用
  2. 本教程帶你一步步完成,ppt很長是因為細,內容不多
  3. 相比cmake,Makefile更加輕量簡潔,侵入性低,掌控力強。語法更少更簡單
  4. 使用Makefile你可以進行更細粒度的掌控,雖然cmake簡化了這些,但是對于大型項目,細節的掌控是必須的
  5. 對于算法落地,我們會面臨各種庫包,理清楚非常有利于降低問題的發生
  6. 這也是高級算法工程師系列課程的基礎,貫穿后續課程的存在。后續會有CUDA編程、TensorRT、基于C++實現BP、流媒體等等

準備環境

  1. VSCode (Visual Studio Code),作為IDE
  2. 安裝VSCode的C++插件
  3. 準備Linux系統(Ubuntu),推薦使用VSCode的SSH插件遠程連接服務器(另一個電腦)進行開發。本地電腦可以是windows/mac
  4. 熟悉C++的基本語法,我們主講Makefile但是會有C++編碼部分(不多)

目錄

  1. g++指令介紹
  2. C++的編譯鏈接過程、編譯時、運行時介紹
  3. Makefile基本語法,依賴關系定義
  4. 基于Makefile的標準工程結構
  5. 基于Makefile實現的完整功能項目
  6. 分析程序依賴項,readelf、ldd
  7. 配置C++的調試功能
  8. 頭文件修改cpp自動編譯的處理方法

GITHUB項目地址(PPT、代碼均在這里)

https://github.com/shouxieai/makefile_tutorial_project

1. g++指令介紹

1.1 g++/gcc是什么,有什么區別

  • g++和gcc都是gnu推出的cpp編譯器,時代不同
  • g++和gcc都可以進行cpp編譯
  • g++和gcc一樣,都屬于driver,即驅動編譯,他會調用cclplus/ccl/ld/as等指令實現編譯鏈接等工作,他們倆只是默認選項上的處理不同
  • 這里我們采用g++而不是gcc
  • g++ 等價于 gcc -xc++ -lstdc++ -shared-libgcc
  • 參考:知乎問題

1.2 g++的編譯過程

4種情況,注意指令的大小寫很重要

  • 預處理:g++ -E main.cpp -o main.i
  • 匯編:g++ -S main.i -o main.s
  • 編譯:g++ -c main.s -o main.o
  • 鏈接:g++ main.o -o main.bin

g++可以允許跨過中間步驟,例如:

  • g++ -S main.cpp -o main.s
  • g++ main.s -o main.bin
  • g++ main.cpp -o main.bin
  • 結果是等價的

比較常用的是編譯-鏈接:

  • 編譯,代碼編譯到二進制:g++ -c main.cpp -o main.o
  • 鏈接,多個二進制鏈接成執行程序:g++ main.o -o main.bin

預處理指令效果:g++ -E main.cpp -o main.i

在這里插入圖片描述

匯編指令效果:g++ -S main.i -o main.s

在這里插入圖片描述

編譯指令效果:g++ -c main.s -o main.o

在這里插入圖片描述

鏈接指令效果:g++ main.o -o out.bin

在這里插入圖片描述

2. C++編譯鏈接 / 編譯時和運行時

2.1 C++編譯鏈接流程圖

在這里插入圖片描述

2.2 C++的聲明和實現

在這里插入圖片描述

2.3 C++的編譯過程-案例

2.3.1 代碼結構,main.cpp和test.cpp

在這里插入圖片描述

2.3.2 main.cpp的匯編代碼

在這里插入圖片描述

2.3.3 test.cpp的匯編代碼

在這里插入圖片描述

2.3.4 兩者匯編代碼對比

  1. main.s里面沒有add函數的具體實現,只有call add操作
  2. add的具體實現在test.s里面

在這里插入圖片描述

2.3.5 帶有命名空間時的名字編碼

在這里插入圖片描述

2.4 C++編譯過程

在這里插入圖片描述

2.5 C++鏈接過程

在這里插入圖片描述

2.6 C++實際的鏈接過程

在這里插入圖片描述

2.7 若add函數在動態庫,lib3rd.so中時

在這里插入圖片描述

2.8 若add函數在靜態庫,libpkg.a中時

在這里插入圖片描述

2.9 編譯鏈接成一個完整程序的過程

在這里插入圖片描述

2.10 C++鏈接時,查找so文件、a文件方式的方式

g++ -lpkg,這里是小寫的L

在這里插入圖片描述

2.11 C++運行時,查找so文件的方式

在這里插入圖片描述

2.12 C++編譯時,頭文件的查找方式

  • 這里是大寫的i,-lfolder

在這里插入圖片描述

3. Makefile基礎

3.1 Makefile基礎-解決的問題是什么

  • 編譯代碼是一個很耗時的事情尤其是代碼量大、CPU差時(邊緣端)
  • 參考官方文檔,查看更多定義:http://www.gnu.org/software/make/manual/make.html

在這里插入圖片描述

3.2 Makefile基礎-代碼域

在這里插入圖片描述

3.3 Makefile基礎-語法

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

  • 生成項可以沒有依賴項,那么如果該生成項文件不存在,command將永遠執行

3.2 依賴關系定義

在這里插入圖片描述

  • 第一次執行make a.o時,由于a.o不存在,執行了command
  • 第二次執行make a.o時,由于a.cpp時間沒有比a.o新,打印a.o is up to date,不需要編譯
  • 生成項和依賴項,從來都是當成文件來看待的

3.3 編譯和鏈接結合起來

在這里插入圖片描述

  • 定義好依賴后make out.bin后,會自動查找依賴關系,并自動按照順序執行command
  • 這是makefile為我們解決的核心問題,剩下就是如何玩的更方便罷了。比如自動檢索a.cpp、b.cpp,自動定義a.o依賴a.cpp。等等

3.4 總結

  1. 變量賦值有4種方式var = 123, var := 123, var ?= 123, var += 123。其中var := 123常用,var += 123常用
  2. 取變量值有兩種,$(var)${var}。小括號大括號均可以
  3. 數據類型只有字符串和字符串數組,空格隔開表示多個元素
  4. $(function arguments)是調用make內置函數的方法,具體可以參考官方文檔的函數大全。但是常用的其實只有少數兩個即可
  5. 依賴關系定義中,如果代碼修改時間比生成的更新/生成不存在時,command會執行。否則只會打印main.o is up to date。這是makefile解決的核心問題
  6. 依賴關系可以鏈式的定義,即b依賴a,c依賴b,而make會自動鏈式的查找并根據時間執行command
  7. command是shell指令,可以使用$(var)來將變量用到其中。前面加@表示執行執行時不打印原指令內容。否則默認打印指令后再執行指令
  8. make不寫具體生成名稱,則會選擇依賴關系中的第一項生成

還有問題

在這里插入圖片描述

4. 基于Makefile的標準工程結構

4.1 Makefile工程結構

在這里插入圖片描述

  • 一個標準工程,我們做如下定義:
  • 具有src目錄,存放我們的代碼,可能有多級,例如main.cpp,foo/foo.cpp等
  • 具有workspace目錄,存放我們編譯后的可執行程序、資源、數據
  • 具有objs目錄,存放由cpp編譯后得到的o文件等中間文件
  • .vscode目錄,存放vscode的cpp配置,用于語法解析器。vscode的c++插件所使用。ctrl+shift+p后搜索c++,找到JSON那一項就是
  • Makefile文件,當前工程的Makefile代碼

4.2 寫代碼

在這里插入圖片描述

  • 這里簡單定義了foo.hpp和foo.cpp,目的是鏈接為可執行程序后,可以執行
  • ifndef是防止重復包含

4.3 解決多級目錄cpp檢索問題

在這里插入圖片描述

4.4 替換src/為objs/,o文件放到objs中

在這里插入圖片描述

4.5 定義依賴關系,通配

在這里插入圖片描述

  • objs/%.o和src/%.cpp代表了通配依賴關系,模式匹配,%相當于變量部分

4.6 為o文件創建目錄

4.6.1 編譯失敗,因為目錄不存在

在這里插入圖片描述

  • 原因是,試圖創建objs/foo/foo.o文件時失敗。因為objs/foo這個目錄不存在造成。對于高版本g++(例如9.0)不會報錯并為你創建objs/foo目錄。
  • 因此我們需要創建objs/foo目錄,需要執行類似mkdir -p dir($@),通過dir($@)獲取其目錄后創建,這里的mkdir -p指多級目錄也一并創建

4.6.2 使用mkdir -p $(dir $@)獲取生成項目錄

在這里插入圖片描述

4.7 鏈接所有o文件生成可執行程序

在這里插入圖片描述

  • 我們定義workspace/pro的生成,依賴自所有的o文件。pro是我們的可執行程序

4.8 完善一下Makefile

在這里插入圖片描述

  • 添加make pro,簡潔的編譯程序
  • 添加make run,編譯后順便執行一下,注意: cd到workspace是為了讓運行程 序后的當前工作目錄在workspace中
  • 添加make clean,清理編譯后的垃圾
  • 添加.PHONY,讓我們作為指令存在的東西,不要被視作為文件。即make這東西時永遠執行command

4.9 完整版本的Makefile

在這里插入圖片描述

4.10 可以愉快的玩耍了

在這里插入圖片描述

4.11 修改一個cpp后觀察效果

在這里插入圖片描述

  • 對,這就是我們想要的,nice!

5. 基于Makefile實現的完整功能項目

  • 這一份代碼,你可以點擊下載

5.1 Makefile工程-一個復雜的例子,實現http請求

  • 實現的目的:

  • 具有兩個依賴,openssl、libcurl

  • 存在include、libs依賴

  • 可以鍛煉一個完整的相對完善的工程案例。還可以鍛煉到代碼調試

  • 實現的效果:

    實現一個程序,可以從任何網站上下載東西

  • 準備:

    • 下載openssl:https://www.openssl.org/source/old/1.1.1/openssl-1.1.1j.tar.gz

      這是用于實現加密通信的加密算法庫。用于訪問https開頭的鏈接

    • 下載libcurl:https://curl.se/download/curl-7.78.0.tar.gz

      這個是用于實現http/https的訪問操作。如果要訪問https,則依賴openssl

5.2 下載和編譯libcurl/openssl

在這里插入圖片描述

  • 創建build目錄,用于儲存下載后的文件,準備用來編譯
  • 創建lean目錄,用于存放編譯后的結果,作為依賴項目錄
  • 將下載后的.tar.gz放到 build目錄下,并解壓出來

5.3 編譯openssl

在這里插入圖片描述

cd openssl-1.1.1j
./config --prefix=/data/sxai/makefile/make7/lean/openssl-1.1.1j
make all -j16 && make install -j16
  • ./config是配置并生成Makefile,指定install到/data/sxai/makefile/make7/lean/openssl-1.1.1j目錄 make all -j16 && make install -j16 這里-j16是同時16個線程執行操作,編譯后,執行安裝
  • 請把這里的lean目錄修改為你當前自己想放的位置

5.4 編譯libcurl

在這里插入圖片描述

./configure --prefix=/data/sxai/makefile/make7/lean/curl7.78.0 \--with-openssl=/data/sxai/makefile/make7/lean/openssl-1.1.1j
make all -j16 && make install -j16
  • --prefix同樣是為了設置安裝目錄,最后編譯好的curl放在哪里
  • --with-openssl指定剛才我們編譯安裝后的目錄
  • ./configure同樣是為了配置curl生成Makefile文件
  • 執行make all -j16實現編譯
  • 執行make install -j16實現安裝

5.5 編譯后結果

在這里插入圖片描述

5.6 配置IntellSense和browse路徑

在這里插入圖片描述

  • 變量${workspaceFolder}代表了我們的當前目錄,即/data/sxai/makefile/make7

5.7 配置Makefile

5.7.1 第一步

在這里插入圖片描述

5.7.2 第二步

在這里插入圖片描述

  • 好,我們齊活了。至此整個makefile已經非常完備了。該makefile可以通用了

給出代碼:


srcs := $(shell find src -name "*.cpp")
objs := $(srcs:.cpp=.o)
objs := $(objs:src/%=objs/%)
mks  := $(objs:.o=.mk)include_paths := lean/curl7.78.0/include \lean/openssl-1.1.1j/includelibrary_paths := lean/curl7.78.0/lib     \lean/openssl-1.1.1j/lib# 把library path給拼接為一個字符串,例如a b c => a:b:c
# 然后使得LD_LIBRARY_PATH=a:b:c
empty := 
library_path_export := $(subst $(empty) $(empty),:,$(library_paths))ld_librarys   := curl ssl crypto# 把每一個頭文件路徑前面增加-I,庫文件路徑前面增加-L,鏈接選項前面加-l
run_paths     := $(library_paths:%=-Wl,-rpath=%)
include_paths := $(include_paths:%=-I%)
library_paths := $(library_paths:%=-L%)
ld_librarys   := $(ld_librarys:%=-l%)compile_flags := -std=c++11 -w -g -O0 $(include_paths)
link_flags := $(library_paths) $(ld_librarys) $(run_paths)# 所有的頭文件依賴產生的makefile文件,進行include
# -include表示如果有異常請不要打印出來
# 這里判斷,如果是clean指令,則不需要生成mk文件
ifneq ($(MAKECMDGOALS), clean)
-include $(mks)
endifobjs/%.o : src/%.cpp@echo 編譯$<,生成$@,目錄是:$(dir $@)@mkdir -p $(dir $@)@g++ -c $< -o $@ $(compile_flags)workspace/pro : $(objs)@echo 鏈接$@@g++ $^ -o $@ $(link_flags)objs/%.mk : src/%.cpp@echo 生成依賴$@@mkdir -p $(dir $@)@g++ -MM $< -MF $@ -MT $(@:.mk=.o) $(compile_flags)pro : workspace/pro@echo 編譯完成run : pro@cd workspace && ./proclean :@rm -rf workspace/pro objs.PHONY : pro run debug cleanexport LD_LIBRARY_PATH:=$(LD_LIBRARY_PATH):$(library_path_export)

5.8 寫代碼

5.8.1 第一段

在這里插入圖片描述

  • 這里寫一個download函數,接收url,然后返回下載后的數據

5.8.2 第二段

  • 注意這里的地址換為:http://www.zifuture.com:1556/fs/sxai/2021/07/pro-18432c111ca44aa9bba49eab650f466c.jpg

在這里插入圖片描述

  • 實現一個main函數,調用download。給定地址是一個圖片下載好后儲存為文件

5.9 執行并觀察結果

在這里插入圖片描述

  • 文件下載成功,至此。整個http的訪問工程就達成了。你學會如何控制,頭文件、庫文件路徑了嗎?還有o文件存放工作目錄等

6. 分析程序依賴項

6.1 使用readelf -d workspace/pro分析

在這里插入圖片描述

6.2 使用ldd workspace/pro分析

在這里插入圖片描述

7. 配置C++的調試功能

7.1 配置task.json

在這里插入圖片描述

  • task.json是配置用來執行調試之前的編譯工作。即,按下F5,編譯程序,進入調試

7.2 配置launch.json

在這里插入圖片描述

  • 這個文件可用通過直接按下F5后自動產生,也可以手動敲哈
  • 如果有參數,可以加到args中
  • stopAtEntry表示啟動后就停止到main函數里邊

7.3 進行調試

  • 好了,我們在main.cpp的29行這個文字左側點擊后后個紅點,作為斷點,然后按下F5鍵,看看會怎么樣

在這里插入圖片描述

7.4 界面介紹

在這里插入圖片描述

7.5 恭喜

  • 到這里,恭喜你,已經掌握了如何使用
  • Makefile在linux下開發的技能了!
  • Congratulations!!!

8. 頭文件修改后自動編譯

  • 代碼請到github上下載:https://github.com/shouxieai/makefile_tutorial_project

在這里插入圖片描述

8.1 新建工程

  • 我們有如下代碼。頭文件a.hpp中定義了Number 888

在這里插入圖片描述

在這里插入圖片描述

8.2 分析原因

  • 原因:缺少a.o對hpp依賴關系的定義。makefile中沒有定義a.o : a.hpp,沒有要求編譯a.cpp需要檢查a.hpp的時間
  • 解決方案?:直接增加a.o : a.cpp a.hpp嗎?是可以。強制要求 a.o生成時檢查a.hpp

在這里插入圖片描述

8.3 解決方案

8.3.1 使用g++ -MM a.cpp -MF a.mk -MT prefix/a.o生成makefile文件a.mk

在這里插入圖片描述

在這里插入圖片描述

  • g++ -MM a.cpp -MF a.mk -MT prefix/a.o生成的makefile文件

8.3.2 通過include a.mk包含生成的文件,使其生效

  • 我們使用g++ -MM a.cpp -MF a.mk -MT a.o
  • 為了使編譯后的a.mk生效,我們可以通過include a.mk包含進來

在這里插入圖片描述

8.3.3 整合起來

注意,這里include a.mk修改為-include a.mk就不會提示報錯了

在這里插入圖片描述

8.3.4 集成到項目中去

在這里插入圖片描述

8.4 把代碼拆分出頭文件用于檢驗效果

在這里插入圖片描述

8.5 至此,完整的Makefile工程搞定

  • 謝謝

CPP工程模版,請參見:

https://github.com/shouxieai/cpp-proj-template

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532458.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch擴展自定義PyThonC++(CUDA)算子的若干方法總結

PyTorch擴展自定義PyThon/C(CUDA)算子的若干方法總結 轉自&#xff1a;https://zhuanlan.zhihu.com/p/158643792 作者&#xff1a;奔騰的黑貓 在做畢設的時候需要實現一個PyTorch原生代碼中沒有的并行算子&#xff0c;所以用到了這部分的知識&#xff0c;再不總結就要忘光了 &a…

給 Python 算法插上性能的翅膀——pybind11 落地實踐

給 Python 算法插上性能的翅膀——pybind11 落地實踐 轉自&#xff1a;https://zhuanlan.zhihu.com/p/444805518 作者&#xff1a;jesonxiang&#xff08;向乾彪&#xff09;&#xff0c;騰訊 TEG 后臺開發工程師 1. 背景 目前 AI 算法開發特別是訓練基本都以 Python 為主&…

chrome自動提交文件_收集文檔及提交名單統計

知乎文章若有排版問題請見諒&#xff0c;原文放在個人博客中【歡迎互踩&#xff01;】文叔叔文檔收集使用動機在我們的學習工作中&#xff0c;少不了要讓大家集體提交文件的情況&#xff0c;舉個最簡單的例子&#xff1a;收作業。 傳統的文件收集流程大致是&#xff1a;群內發出…

Pytorch自定義C++/CUDA擴展

Pytorch自定義C/CUDA擴展 翻譯自&#xff1a;官方文檔 PyTorch 提供了大量與神經網絡、張量代數、數據整理和其他操作。但是&#xff0c;我們有時會需要更加定制化的操作。例如&#xff0c;想要使用論文中找到的一種新型的激活函數&#xff0c;或者實現自己設計的算子。 在 Py…

惠普800g1支持什么內存_惠普黑白激光打印機哪種好 惠普黑白激光打印機推薦【圖文詳解】...

打印機的出現讓我們在生活和日常工作中變得越來越方便&#xff0c;不過隨著科技的發展&#xff0c;打印機的類型也變得非常多&#xff0c;其中就有黑白激光打印機&#xff0c;而黑白激光打印機的品牌也有很多&#xff0c;比如我們的惠普黑白激光打印機&#xff0c;今天小編就給…

控制臺輸出顏色控制

控制臺輸出顏色控制 轉自&#xff1a;https://cloud.tencent.com/developer/article/1142372 前端時間&#xff0c;寫了一篇 PHP 在 Console 模式下的進度顯示 &#xff0c;正好最近的一個數據合并項目需要用到控制臺顏色輸出&#xff0c;所以就把相關的信息整理下&#xff0c;…

idea連接跳板機_跳板機服務(jumpserver)

一、跳板機服務作用介紹1、有效管理用戶權限信息2、有效記錄用戶登錄情況3、有效記錄用戶操作行為二、跳板機服務架構原理三、跳板機服務安裝過程第一步&#xff1a;安裝跳板機依賴軟件yum -y install git python-pip mariadb-devel gcc automake autoconf python-devel readl…

【詳細圖解】再次理解im2col

【詳細圖解】再次理解im2col 轉自&#xff1a;https://mp.weixin.qq.com/s/GPDYKQlIOq6Su0Ta9ipzig 一句話&#xff1a;im2col是將一個[C,H,W]矩陣變成一個[H,W]矩陣的一個方法&#xff0c;其原理是利用了行列式進行等價轉換。 為什么要做im2col? 減少調用gemm的次數。 重要…

反思 大班 快樂的機器人_幼兒園大班教案《快樂的桌椅》含反思

大班教案《快樂的桌椅》含反思適用于大班的體育主題教學活動當中&#xff0c;讓幼兒提高協調性和靈敏性&#xff0c;創新桌椅的玩法&#xff0c;正確爬的方法&#xff0c;學會匍匐前進&#xff0c;快來看看幼兒園大班《快樂的桌椅》含反思教案吧。幼兒園大班教案《快樂的桌椅》…

DCN可形變卷積實現1:Python實現

DCN可形變卷積實現1&#xff1a;Python實現 我們會先用純 Python 實現一個 Pytorch 版本的 DCN &#xff0c;然后實現其 C/CUDA 版本。 本文主要關注 DCN 可形變卷積的代碼實現&#xff0c;不會過多的介紹其思想&#xff0c;如有興趣&#xff0c;請參考論文原文&#xff1a; …

藍牙耳機聲音一頓一頓的_線控耳機黨陣地轉移成功,OPPO這款TWS耳機體驗滿分...

“你看到我手機里3.5mm的耳機孔了嗎”&#xff0c;這可能是許多線控耳機黨最想說的話了。確實&#xff0c;如今手機在做“減法”&#xff0c;而廠商們首先就拿3.5mm耳機孔“開刀”&#xff0c;我們也喪失了半夜邊充電邊戴耳機打游戲的樂趣。竟然如此&#xff0c;那如何在耳機、…

AI移動端優化之Im2Col+Pack+Sgemm

AI移動端優化之Im2ColPackSgemm 轉自&#xff1a;https://blog.csdn.net/just_sort/article/details/108412760 這篇文章是基于NCNN的Sgemm卷積為大家介紹Im2ColPackSgemm的原理以及算法實現&#xff0c;希望對算法優化感興趣或者做深度學習模型部署的讀者帶來幫助。 1. 前言 …

elementui的upload組件怎么獲取上傳的文本流、_抖音feed流直播間引流你還不會玩?實操講解...

本文由艾奇在線明星優化師寫作計劃出品在這個全民驚恐多災多難且帶有魔幻的2020&#xff0c;一場突如其來的疫情改變了人們很多消費習慣&#xff0c;同時加速了直播電商的發展&#xff0c;現在直播已經成為商家必爭的營銷之地&#xff0c;直播雖然很火&#xff0c;但如果沒有流…

FFmpeg 視頻處理入門教程

FFmpeg 視頻處理入門教程 轉自&#xff1a;https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2020年1月14日 FFmpeg 是視頻處理最常用的開源軟件。 它功能強大&#xff0c;用途廣泛&#xff0c;大量用于視頻網站和商業軟件&…

checkbox wpf 改變框的大小_【論文閱讀】傾斜目標范圍框(標注)的終極方案

前言最常用的斜框標注方式是在正框的基礎上加一個旋轉角度θ&#xff0c;其代數表示為(x_c,y_c,w,h,θ)&#xff0c;其中(x_c,y_c )表示范圍框中心點坐標&#xff0c;(w,h)表示范圍框的寬和高[1,2,7]。對于該標注方式&#xff0c;如果將w和h的值互換&#xff0c;再將θ加上或者…

徹底理解BP之手寫BP圖像分類你也行

徹底理解BP之手寫BP圖像分類你也行 轉自&#xff1a;https://zhuanlan.zhihu.com/p/397963213 第一節&#xff1a;用矩陣的視角&#xff0c;看懂BP的網絡圖 1.1、什么是BP反向傳播算法 BP(Back Propagation)誤差反向傳播算法&#xff0c;使用反向傳播算法的多層感知器又稱為B…

h5頁面禁止復制_H5移動端頁面禁止復制技巧

前言&#xff1a;業務需要&#xff0c;需要對整個頁面禁止彈出復制菜單。在禁止的頁面中加入以下css樣式定義* {-webkit-touch-callout:none;/*系統默認菜單被禁用*/-webkit-user-select:none;/*webkit瀏覽器*/-khtml-user-select:none;/*早起瀏覽器*/-moz-user-select:none;/*…

梯度下降法和牛頓法計算開根號

梯度下降法和牛頓法計算開根號 本文將介紹如何不調包&#xff0c;只能使用加減乘除法實現對根號x的求解。主要介紹梯度下降和牛頓法者兩種方法&#xff0c;并給出 C 實現。 梯度下降法 思路/步驟 轉化問題&#xff0c;將 x\sqrt{x}x? 的求解轉化為最小化目標函數&#xff…

匯博工業機器人碼垛機怎么寫_全自動碼垛機器人在企業生產中的地位越來越重要...

全自動碼垛機器人在企業生產中的地位越來越重要在智能化的各種全自動生產線中&#xff0c;全自動碼垛機器人成了全自動生產線的重要機械設備&#xff0c;在各種生產中發揮著不可忽視的作用。全自動碼垛機器人主要用于生產線上的包裝過程中&#xff0c;不僅能夠提高企業的生產率…

kmeans手寫實現與sklearn接口

kmeans手寫實現與sklearn接口 kmeans簡介 K 均值聚類是最基礎的一種聚類方法。它是一種迭代求解的聚類分析算法。 kmeans的迭代步驟 給各個簇中心 μ1,…,μc\mu_1,\dots,\mu_cμ1?,…,μc? 以適當的初值&#xff1b; 更新樣本 x1,…,xnx_1,\dots,x_nx1?,…,xn? 對應的…