news 2026/10/5 6:02:42

MATLAB接入本地DeepSeek:用Ollama打造私有化AI编程助手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MATLAB接入本地DeepSeek:用Ollama打造私有化AI编程助手

我最早接触本地大模型,纯粹是被MATLAB逼的。手里一堆跑了好几年的脚本、好几版迭代的模型参数、还有半层楼那么高的实验数据,想用AI帮忙写代码、改代码,但又不想把数据丢到云端,更不想每次都要把上下文复制粘贴到网页对话框里。后来我花了一个周末,把DeepSeek在本地部署起来,再写了个小工具让MATLAB能直接跟它对话,从此MATLAB编辑器里就多了一个随叫随到的本地AI助手。这篇文章就是把整套方案完整拆开,从环境部署、模型选型,到MATLAB怎么调用、怎么封装成自己的工具箱函数,再到实际踩过的坑,一次性讲透。

这套东西适合谁?我觉得是两类人最需要。一类是像我一样手上有大量MATLAB代码、又要接触AI编程但受限于数据隐私或网络环境的工程师和科研人员;另一类是刚接触本地部署大模型,想找一个有真实业务场景来练手的人。只要你电脑配置不是太老,跟着这篇文章走下去,大概率能复现出一个可用的私有化AI编程助手,而且整个链路里所有代码都是可控、可改、可断网的。

1. 这个方案要解决什么问题

1.1 MATLAB用户为什么需要本地大模型

先说一个很现实的问题:MATLAB用户的AI需求,跟写Python的人完全不一样。Python生态里有Copilot、Cursor这些工具,回车一按AI就能补全代码,但那套东西对MATLAB用户来说并不友好。

一是MATLAB的语法和工具箱太多,通用AI模型很容易“一本正经地胡说八道”。它可能给你写出一个看着像模像样、一跑就报错的函数,你得反复调试半天。二是很多做信号处理、光学仿真、生物医学工程的用户,代码和数据就是吃饭的家伙,公司或者课题组根本不允许你把代码片段发到外部API去。三是MATLAB本身在AI代码辅助这块确实薄弱,编辑器虽然有代码补全,但离“帮我写一个函数”“帮我解释这段报错”这种需求差得远。

所以本地部署一个DeepSeek来补这个缺口,几乎是顺理成章的事。模型跑在自己机器上,代码不出内网,断网也能用,而且DeepSeek这类开源模型对代码生成的理解力属于第一梯队。把它接到MATLAB里,相当于给MATLAB配了一个私有化的AI结对编程队友,还不限次数、不用按token付费。

1.2 为什么是 DeepSeek,为什么走 Ollama

有人可能会问,本地部署大模型又不是只有DeepSeek一个选择,为什么标题里指名道姓要它?我的理由有三个。

第一,DeepSeek的代码能力确实能打。从我实际测试的情况看,在“生成MATLAB函数”“把Python代码翻译成MATLAB”“解释复杂报错”这些典型场景里,它的表现跟更大参数的通用模型差距很小,但模型体积小得多,家用电脑就能跑。第二,它支持很长的上下文,我经常把整个函数文件(几百行)丢进去让它做重构分析,这很关键。第三,生态成熟,HuggingFace上有官方权重,Ollama仓库里一键就能拉取使用,不用你去处理格式转换、量化这些脏活累活。

Ollama就是本地部署这步的“基础设施”。它把模型管理、量化、API服务全部封装好了,装完之后你不需要理解什么KV Cache、什么GGUF量化格式,一条命令就能把模型拉下来跑起来,并且自动在本地提供一个HTTP接口。MATLAB这边只需要用webwrite去请求这个接口,整个链路就通了。这套方案对普通工程师来说,是门槛最低、最容易复现的路子。

这里我想多说一句心里话:很多教程一上来就让人配置Python环境、源码编译、CUDA加速,完全不顾用户其实只是想用AI写个循环。Ollama的最大价值就是把“研究级项目”变成了“装机就能用的软件”,我们作为要用MATLAB解决实际问题的人,没必要在部署环节做太多研究。

2. 环境准备与模型选型

2.1 硬件底线与参数估算

本地部署DeepSeek,第一步要弄清楚一个问题:我这台电脑跑得动吗?我把经验数值直接列出来,大家按着自己的显卡对号入座。

模型规格量化后显存参考适合场景实际体验
deepseek-r1:1.5b1~2 GB简单问答、正则匹配、公式推导快,但能力有限,复杂代码容易出错
deepseek-r1:7b6~8 GB日常MATLAB代码生成、代码解释速度和效果比较均衡,推荐起点
deepseek-r1:14b10~12 GB多文件分析、重构、复杂调试效果明显更好,需要中高端显卡
deepseek-r1:32b20~24 GB工程级代码审查、长文档处理体验接近在线模型,门槛也高

上面这些数字是按常见的Q4量化模型来算的,实测会有浮动。如果你没有独立显卡,或者显存低于6GB,也不是完全不能用,可以直接跑1.5b或者7b的CPU版本,速度慢一点,但处理一两百行的代码文件还是等得起的。

我做了一个小估算,大家可以参考:8GB显存的显卡,跑7b量化模型,生成100个token大概需要5到10秒。这个速度用来“让AI帮我写完一个函数”是够用的,但你要是想让它逐行给你注释一个300行的代码文件,那就得有耐心等。所以我的建议是:先跑7b,如果觉得不够聪明再往上换14b,没必要一上来就追求顶配,56GB显存那种配置不是所有人都有的。

2.2 安装 Ollama 并拉取模型

Ollama的安装非常简单,去官网下对应系统的安装包,或者用命令行一键脚本装。Windows装完就是一个后台服务,Linux和macOS用brew或者curl脚本都行。装完之后打开终端,先确认一下服务是活的:

ollama --version ollama list

如果ollama list能正常返回(第一次可能为空列表),说明Ollama已经装好了。然后拉取DeepSeek模型,这一步是全程最花时间的:

ollama run deepseek-r1:7b

这条命令会先把模型下载到本地,下载完成后自动进入一个交互式聊天界面。你可以先在这里测试一下,输入“用MATLAB写一个函数,实现快速傅里叶变换并绘制频谱”,如果它能正常回答,说明模型本身没问题,接下来我们再让MATLAB去调用它。

这里有个坑我必须提前说:Ollama默认的模型下载地址在国外,国内某些网络环境下可能会卡在99%不动。我当时的处理办法是配置镜像源,也就是给Ollama设置一个国内的模型下载镜像地址,设置完重新拉取就顺畅多了。另外一个经验是,模型下载过程中如果中断,重新执行ollama run会断点续传,不需要从头再来,所以卡住了别急着删了重来,先Ctrl+C再跑一次试试。

2.3 先让服务跑起来:验证部署正确

模型就绪之后,Ollama会在本地起一个HTTP服务,默认监听127.0.0.1:11434。注意这个地址,后面MATLAB连接全靠它。我先用curl快速验证一下接口是不是通的:

curl http://127.0.0.1:11434/api/chat -d '{ "model": "deepseek-r1:7b", "messages": [{"role": "user", "content": "用一句话介绍MATLAB"}], "stream": false }'

如果一切正常,你会收到一段JSON格式的回复,里面包含模型生成的文本。看到这个返回,整个本地部署环节就算走通了,剩下的问题就是怎么让MATLAB把请求发出去、把回复解析回来。

可能有人会问,为什么要先手动验证这一步?因为这样一来,后面MATLAB不管出现什么问题,我们都能快速判断是模型服务的问题还是MATLAB代码的问题,排查范围直接缩小一半。我在实际过程中吃过这个亏,一开始MATLAB报错,我以为是webwrite写错了,折腾半天才发现是Ollama服务根本没启动。先把地基打牢,再往上盖楼,永远是最高效的。

3. MATLAB 对接方案怎么选

3.1 三条路线的对比

MATLAB连接Ollama,市面上常见的方案有三条路,我列个表格给你看清楚:

方案原理优点缺点
直接调REST API用webwrite请求Ollama的HTTP接口零依赖、纯MATLAB代码、可控性强需要自己封装函数和协议
走OpenAI兼容层用官方大模型接口的MATLAB适配包代码结构化、后续可切换其他模型需要额外安装工具箱
找现成的第三方工具包如GitHub上开源MATLAB-Ollama客户端拿来即用、省时间更新维护参差不齐、黑盒

我的判断是:如果是为了长期用、要深度定制,直接调REST API是最实在的。原因很简单,Ollama给的就是一个简单HTTP接口,MATLAB的webwrite本来就是为了调这类接口而生的,你只需要处理好请求和响应两个环节即可。封装成函数后,跟用工具箱没区别,但代码在自己的手里,想加什么功能都很方便。

OpenAI兼容层这条路线,适合准备以后在多个大模型之间切换的用户,因为很多在线模型都提供OpenAI格式的接口,写一套代码到处能用。但对本地场景来说有点杀鸡用牛刀。第三方工具包我也试过几个,有的确实能用,但经常出现“作者不维护了,MATLAB升级后接口失效”的情况,一旦出问题你还得回头读懂别人的代码,成本反而更高。

3.2 幕后原理:MATLAB 其实是在调 REST API

很多人听到“API”就头大,其实把原理拆开看非常简单。模型部署好之后,它就像一个24小时值班的接线员,坐在一台固定电话旁边,电话号码就是127.0.0.1:11434。你想让模型干活,只需要给它发一封格式固定的信件,信里写清楚三件事:用哪个模型、你的问题是什么、要不要流式输出。

Ollama收到信之后,会处理好一切内部逻辑,然后给你回一封信,也就是一个JSON字符串,里面包含模型生成的文本。MATLAB要做的就是两件事:把“信”按格式寄出去(webwrite),解析寄回来的“信”(jsondecode)。这个思路一旦在你脑子里成形,后面的代码就顺理成章了。

这也是我想提醒所有MATLAB用户的一点:不要觉得调用大模型是什么玄学,本质上跟你用webread去请求天气接口没有任何区别。区别只在于请求体和响应体的结构复杂了一点,但你只需要写一次通用函数,之后每次调用就跟调用自己的函数一样。

4. 手写一个 MATLAB 客户端

4.1 版本1:单轮问答,把流程跑通

我先把最小可用的版本写出来,你先不用管多轮对话和优雅报错,就让整个链路先通起来。

function answer = deepseek_chat(userPrompt) % 调用本地 DeepSeek 模型,返回文本回复 url = "http://127.0.0.1:11434/api/chat"; body = jsonencode(struct(... 'model', 'deepseek-r1:7b', ... 'messages', struct('role', 'user', 'content', userPrompt), ... 'stream', false)); options = weboptions(... 'MediaType', 'application/json', ... 'Timeout', 120); response = webwrite(url, body, options); data = jsondecode(response); answer = data.message.content; end

把这个函数保存成.m文件,然后在命令行里测试:

>> resp = deepseek_chat('用MATLAB写一个函数,计算一组数据的均值和标准差'); >> disp(resp)

如果一切正常,你会看到模型直接输出一段可以运行的MATLAB代码。这个过程跑通之后,你就已经拥有一个能随叫随到的私有化AI编程助手了。

这里有几个细节值得一说。首先是stream参数,我们把它设为false,意思是让模型一次性生成完再整体返回,这样对短问答最省事。如果设为true,模型会一个token一个token地往外吐,后面要做流式展示才用得上,现在先不考虑。第二是Timeout,我设置成120秒,因为本地模型在生成较长代码时可能超过默认的10秒超时,如果你不设置这里,大概率会报“请求超时”的错误。第三是jsonencode函数,它负责把MATLAB的struct转成JSON字符串,这是很多新手容易漏掉的一步。

4.2 版本2:多轮对话和历史记录

单轮问答很快就会发现不够用。比如你想让AI先看一下你的代码文件,再帮你修改某一个函数,如果每次都是无状态的单轮请求,AI根本不记得刚才给它看过什么。所以我们要加入消息历史机制。

Ollama的接口设计很简单,messages字段是一个数组,你把对话历史按顺序放进去就行。我直接写成这样:

function answer = deepseek_chat_with_history(messages) url = "http://127.0.0.1:11434/api/chat"; body = jsonencode(struct(... 'model', 'deepseek-r1:7b', ... 'messages', messages, ... 'stream', false)); options = weboptions(... 'MediaType', 'application/json', ... 'Timeout', 120); response = webwrite(url, body, options); data = jsondecode(response); answer = data.message.content; end

调用的时候,你自己维护一个消息数组:

messages = {}; messages{end+1} = struct('role', 'user', 'content', '我有一段MATLAB代码,稍后发给你'); messages{end+1} = struct('role', 'user', 'content', fileread('my_script.m')); messages{end+1} = struct('role', 'user', 'content', '请帮我优化这段代码的循环部分'); resp = deepseek_chat_with_history(messages);

这就是多轮对话的全部秘密,非常简单。但有个细节要注意:随着对话轮数增加,messages数组会越来越长,而本地模型的上下文窗口是有限的。我个人的习惯是,如果一轮对话超过10轮,就把最早的消息删掉,只保留最近几轮,避免模型“忘记”最开始的需求,也避免请求体过大导致生成变慢。

4.3 版本3:把它封装成工具箱风格的函数

单轮和多轮都搞定之后,我想让自己的代码用起来更顺手,就把它封装成了一个类,用起来有点像工具箱那种感觉。当然,对大多数场景,函数式封装已经够用,但如果你也喜欢更工程化的方式,可以参考这个思路。

我先定义一个小类,维护模型名、温度参数和消息历史:

classdef DeepSeekClient < handle properties ModelName = 'deepseek-r1:7b' Temperature = 0.7 Messages = {} Timeout = 120 end methods function obj = DeepSeekClient(modelName) if nargin > 0 obj.ModelName = modelName; end end function answer = chat(obj, userPrompt) obj.Messages{end+1} = struct('role', 'user', 'content', userPrompt); url = "http://127.0.0.1:11434/api/chat"; body = jsonencode(struct(... 'model', obj.ModelName, ... 'messages', obj.Messages, ... 'stream', false, ... 'options', struct('temperature', obj.Temperature))); options = weboptions('MediaType', 'application/json', 'Timeout', obj.Timeout); response = webwrite(url, body, options); data = jsondecode(response); answer = data.message.content; obj.Messages{end+1} = struct('role', 'assistant', 'content', answer); end function reset(obj) obj.Messages = {}; end end end

用起来就像这样:

client = DeepSeekClient('deepseek-r1:14b'); client.chat('给我写一个可以读取CSV文件的MATLAB脚本'); client.chat('再加一个参数,允许用户指定跳过多少行'); client.chat('把整套代码打印成完整版本');

这种封装的好处是,你不需要在业务代码里关心消息历史怎么维护,每次调用chat方法,它自己会记住上下文。这让我后来在脚本里调用模型时,代码干净很多。如果你把Temperature调高到0.9左右,回答会更加发散、更像人话,但写代码时我建议保持0.7以下,不然它容易发挥过头,给你生成一些“看上去合理但根本不存在”的函数名。

4.4 安全红线:模型生成的代码别直接跑

我要在这里说一句可能是全文最重要的提醒:千万不要让模型生成的代码直接在你的MATLAB主进程里执行。本地推理确实保护了数据隐私,但AI模型本质上是概率生成器,它给出的代码可能有隐藏的逻辑漏洞,甚至可能是故意编写的恶意代码(如果你用了来路不明的模型权重,这种风险更大)。

正确做法是:把模型生成的代码先保存成.m文件,人工过目一遍逻辑,再用mlint做一次静态检查,最后才在测试脚本里调用。如果需要批量验证,也尽量放在隔离的临时目录里执行,不要直接污染你的正式工程目录。

这不是危言耸听。我见过有同事让AI生成一段“批量重命名文件”的代码,直接跑下去差点把实验数据文件夹给改了名。模型不是故意害人,它只是不知道你文件系统里有什么其他文件。所以,AI可以当队友,但最终把关的必须是你的脑子。

5. 进阶玩法:从“聊天”到“生产力”

5.1 批量扫描 .m 文件做 Code Review

打通了基础调用之后,我开始琢磨怎么把它真正用起来。头一个想到的场景就是代码审查。工程里积累了几百个.m文件,靠人一个个读,既不现实也容易漏,本地模型正好能当第二双眼睛。

思路是这样的:遍历某个文件夹下所有.m文件,逐个把代码内容拼进prompt,让模型按固定格式输出意见,再统一汇总。我写了一个简单的脚本骨架:

function review_results = batch_review_code(folderPath) files = dir(fullfile(folderPath, '*.m')); review_results = {}; for k = 1:length(files) code = fileread(fullfile(folderPath, files(k).name)); prompt = sprintf([ '请对下面这段MATLAB代码进行审查,重点看:\n' ... '1. 潜在的性能瓶颈\n' ... '2. 变量命名和可读性问题\n' ... '3. 是否存在边界条件错误\n' ... '请用中文回答,先列出问题,再给出修改建议。\n\n代码:\n%s' ], code); resp = deepseek_chat(prompt); review_results{end+1} = struct('file', files(k).name, 'review', resp); fprintf('已完成: %s\n', files(k).name); end end

实测下来,这个方案对发现“循环里反复调用大型函数”“忘记预分配数组导致运行缓慢”这类问题是有效的,尤其是那种写着写着就忘了维护的旧代码。模型给出的建议未必每条都对,但可以作为人工复查的线索清单,效率提升很明显。

5.2 把 MATLAB 代码翻译成 Python / C++

还有一个我经常用到的场景是跨语言迁移。实验室里用MATLAB写的算法,到了工程落地阶段往往要改成Python或者C++。以前这活儿得人肉一行行翻译,耗神又容易出错,现在我可以直接把整个函数丢给DeepSeek,让它输出目标语言的版本。

举个例子,我之前把一个做二维插值的MATLAB函数翻译成Python,模型不仅转换了语法,还注意到MATLAB的interp2默认是linear插值,在Python里对应scipy.interpolate.interp2d,这种跨库的对应关系是我在指令里没有特意说明的,它能自己关联到,确实让人意外。翻译完成之后再手动改改边界细节,效率至少翻倍。

实用技巧是:翻译任务要在prompt里明确“保持相同输入输出接口”“注意MATLAB与目标语言的函数对应关系”“不要遗漏边界处理”。模型遇到模糊需求时往往会自由发挥,你的指令给得越具体,输出就越接近可用状态。

5.3 写注释、文档和报告

代码注释和文档是很多人头疼的事,本地模型在这块也是把好手。我经常把实现完的函数发给DeepSeek,让它帮我把注释补全,同时生成函数的markdown格式说明,包括输入参数、输出参数、调用示例。模型对MATLAB标准注释格式(比如函数开头的H1行)也熟悉,生成出来的注释风格很专业。

报告场景更有意思。我会把一段分析流程的运行结果和关键图表的标题描述给它,让它起草一段总结性的文字,我再人工修改。

这对按周更新进展的工程师来说很省时间,而且因为是本地推理,实验数据细节不外传,在项目早期保密阶段尤其安心。

5.4 一个具体例子:让 DeepSeek 生成 MEX 骨架

我在搜索材料时看到很多人在问“MATLAB怎么运行C++程序”,正好这个场景跟本地AI模型结合度很高。MATLAB要调用C/C++代码,常规做法是写MEX文件,这就涉及一个很繁琐的准备工作:头文件引入、接口函数设计、矩阵数据转换。DeepSeek对这种固定模式的生成任务完成度相当高。

我试过一个完整流程:让模型生成一个接收二维矩阵并返回逐元素平方的MEX函数。它给出的代码包含了mexFunction入口、plhs/prhs参数处理、mxGetPr数据读取,基本能通过编译,只需要微调几个类型判断。原来的工作量大概需要半小时,现在可能五分钟就搞定初稿,很适合用来提速开发。

这种方法表面上是“让AI写C++”,本质上是把模型当成“熟悉模板和惯例的初级工程师”。它的局限在于,MEX涉及大量MATLAB内部API,模型对某些冷门接口记不准,所以你在让模型生成这类代码时,最好在prompt里附上你用的MATLAB版本,并且提醒它“只使用常见且稳定的API”,可以减少瞎编的概率。

6. 踩坑实录与排查速查表

6.1 部署阶段最容易翻车的五个点

部署阶段的问题,往往不是模型本身的问题,而是环境问题。我把自己遇到过的几个经典问题整理成一张表,给还没入坑的人提前打打预防针。

现象大概率原因处理办法
ollama命令找不到环境变量没配置好Windows重装并勾选加入PATH;Linux检查安装路径
模型卡在99%不动网络下载不稳定配置国内镜像源后重新拉取,断点续传即可
服务能启动但访问慢模型首次加载或内存不足等待几秒,或换小模型,设置keep_alive保持常驻
CPU推理特别慢没启用GPU加速或缺GPU驱动确认Ollama GPU版本,安装对应CUDA驱动
端口被其他程序占用本机有其他服务在监听11434换端口OLLAMA_HOST,或关掉冲突进程

最后一条我实际碰到过一次,本机开了个监控软件,正好占用了11434端口。排查了很久才发现不是Ollama的问题。一个好习惯是每次启动前先看一眼端口监听状态,确认Ollama真的在跑。

6.2 调用阶段的高频报错

部署和MATLAB连接之间出问题,占大头的基本是webwrite的请求格式或者超时设置。我把常见报错和解决思路列出来:

  • 报错“请求超时”:默认Timeout太短。把weboptions里的Timeout调整到120秒以上,或者换更小的模型。
  • 报错“返回内容无法解析”:先disp(response),看看返回的JSON长什么样,确认data.message.content这个字段是否存在。
  • 中文乱码:确认MATLAB脚本文件用UTF-8保存,同时检查Ollama返回的JSON编码是否正常。
  • 返回“Connection refused”:Ollama服务没启动,或者端口不对。curl一下确认服务状态。
  • 模型输出越来越长但越来越偏:messages历史太长,上下文被污染了。清空重来,或者把历史截断。

还有一个我自己出现过多次的经济教训:webwrite的body参数,必须用jsonencode转成字符串,而不是直接传MATLAB struct。有些版本的MATLAB会自动转换,有的不会,出问题时最优先检查这里。

6.3 让推理提速的几个实惠办法

最后聊一聊提速。本地模型跑在个人电脑上,肯定没有云端那种秒回的体验,但几个小技巧能明显改善:

一是换小模型或在模型大小和量化之间做平衡。如果只是做代码片段问答,7b已经够用,没必要硬上14b。二是用keep_alive参数让模型常驻显存,避免每次请求都重新加载模型权重,这个优化对体验的提升非常明显,能让首token延迟从十几秒降到一两秒。三是尽量设置stream为false,不要用流式输出。这听起来反直觉,但在MATLAB场景里,流式输出意味着你得持续监听连接、持续解析,反而更慢,一次性拿结果最省事。

最后一个小技巧是:把常用的prompt模板存成配置文件,比如“代码审查模板”“翻译Python模板”“生成注释模板”,需要用时直接读取模板、插入代码,这样既能保证输出格式稳定,也能减少你打字的错误率。说白了,本地AI助手的价值上限,很大程度上取决于你的prompt模板设计能力,而不是显卡有多贵。

我自己用了这套本地AI编程助手几个月,现在最常做的一件事,是写完一个粗糙能跑的函数后,直接让DeepSeek给我提优化建议。它给的建议不总是最优解,但经常能提醒我忽略的边界场景,这就已经值回部署的时间成本了。如果你也想给MATLAB配上这样一个私有化助手,按这篇的步骤走,应该能少走很多我走过的弯路。后面等你把基础跑通了,还可以再研究接入语音输入、配合自动化测试脚本这些更深的玩法,那又是另一段故事了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 6:02:07

STM8实战:UART1、EEPROM、FLASH与IIC外设开发避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 6:01:51

MRAM替代SPI Flash实战:MR25H40CDF与STM32L031K6工业存储方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 6:00:06

Windows下CUDA 11.0与cuDNN 8.0.5深度学习环境配置全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 5:59:18

C++坦克大战源码解析:easyX游戏开发实战与模块拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 5:58:41

Xpath实战:完整爬取豆瓣读书Top250数据

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华