一位ALS患者在生命走到尽头前用脚贡献了最后一个代码补丁

Adrian Hands是一位ALS患者,在生命最后阶段,他克服重重困难,使用脚操作莫尔斯码键盘模拟器为GNOME提交了一个重要的代码补丁,修正了一个存在9年的BUG。

 一位ALS患者在生命走到尽头前用脚贡献了最后一个代码补丁,修正了GNOME中一个存在了9年的BUG。

一位ALS患者在生命走到尽头前用脚贡献了最后一个代码补丁,修正了GNOME中一个存在了9年的BUG。



ALS是
肌肉萎缩性侧索硬化症,是一种渐进和致命的神经退行性疾病,病人的肌肉会逐渐衰弱、萎缩,丧失运动能力。上面这位,Adrian Hands就是一位ALS病人,他在已经失去了运动能力、双手残废无法使用键盘的情况下,用脚在一个莫尔斯码键盘模拟器上编写代码,为GNOME提交了生命中最后一个patch。

以下是他的儿子Ian Hands在GNOME的邮件列表里的一段话

I would like to extend my thanks to the gnome team/community for a great last moment with my dad. Adrian Hands (my father) wrote the patch above to improve the usability of gnome for himself and others. You see my dad was suffering from ALS and his hands were so crippled he could no longer use a keyboard. Thus we used a Darci usb morse code keyboard emulator to help him type. Even the morse code device was a struggle as the sensitivity adjustment and positioning of the nice two paddled key would fall out of whack. I rigged up a pvc cage that wrapped around his knee and fixed remote switches to the cage so that he could use the remaining strength in his legs to operate the Darci morse code device. He used this last bit of body movement to write this patch. Here is a photo of him using it: https://picasaweb.google.com/HandsAdrian/ShotwellConnect#5549467460761802914 My father passed away yesterday. I went back through my email to find our last correspondence (he was in India for treatment, and I live in Raleigh). I would like to share the email with you.<email> On Sun, Jan 30, 2011 at 12:16 PM, Adrian Hands < handsadrian@gmail.com > wrote: > ACCEPTed > COMMITed > RESOLVEd > BOO-YAH! > > commit 0b209b1ff16e863e60a1d86413aa57c5fbde76b0 > Author: Adrian Hands < handsadrian@gmail.com > > Date: Fri Dec 31 14:34:58 2010 +0100 > > Add Copy Image and Copy Path to clipboard functionality > > Fixes bug 78514 . > > data/eog-ui.xml | 9 +++++++ > src/eog-window.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 72 insertions(+), 0 deletions(-) I have the coolest Dad in the world! </email> I am so glad that my last comment to my Dad was something like this. Adrian Hands loved free software / open source. I do as well. Thanks so much for the great software, and a new great memory.

我总是很感激生命中总是一直存在着这样伟大的人创造着一个又一个励志故事和事迹,他们存在于各行各业,有的并不出名,但是还是能感动到我,激励到我,有志者,事竟成!

特地写此文纪念这位伟大的程序员,Adrian Hands,R.I.P

<think>我们使用Tensor Toolbox中的cp_als函数进行CP分解。首先需要确保已经安装了Tensor Toolbox。 以下是一个示例代码,展示如何对一个三阶对称张量进行CP分解(假设张量已经以tensor格式创建): 注意:对称张量的CP分解可能由于对称性而需要特殊处理,但cp_als函数本身不要求对称性,因此可以直接使用。 步骤: 1. 将张量创建为tensor对象(这里我们假设已经有一个对称张量T)。 2. 使用cp_als函数进行分解,指定分解的秩(例如R=3)。 3. 分解结果是一个ktensor,可以提取因子矩阵。 示例代码: ```matlab % 加载Tensor Toolbox addpath(genpath(&#39;tensor_toolbox&#39;)); % 如果已经下载并解压,请确保路径正确 % 创建一个三阶对称张量示例(这里以3x3x3为例) % 假设我们有一个对称张量,它的每个元素由对称函数定义,例如T(i,j,k)=i+j+k(这里仅示例,实际对称张量需要对称) % 但实际上,对称张量需要满足对于任意置换,值不变。这里我们创建一个简单的对称张量。 % 创建一个3x3x3的全1张量,然后根据对称性赋值(这里我们使用一个简单的对称张量:所有元素等于下标和) sz = 3; % 每个维度的大小 T = zeros(sz, sz, sz); for i = 1:sz for j = 1:sz for k = 1:sz T(i,j,k) = i + j + k; % 这里仅作为示例,实际并不对称,因为i+j+k在置换下不变,所以是对称的 end end end % 将T转换为tensor对象 T = tensor(T); % 设定CP分解的秩 R = 2; % 这里选择秩为2,可以根据需要调整 % 使用cp_als进行CP分解 % 最大迭代次数和容忍度可以使用可选参数 result = cp_als(T, R, &#39;printitn&#39;, 10); % &#39;printitn&#39; 控制输出迭代信息 % 显示结果 result % 提取因子矩阵 U = result.U; % 这是一个cell数组,包含三个因子矩阵(对于三阶张量) U1 = U{1}; U2 = U{2}; U3 = U{3}; % 重构张量 T_reconstructed = full(result); % 计算误差 error = norm(T - T_reconstructed) / norm(T); fprintf(&#39;相对误差: %e\n&#39;, error); ``` 注意:实际中,对称张量可能希望分解后的因子矩阵相同(即对称CP分解),但cp_als并不强制对称性,因此分解出的因子矩阵可能不同。如果希望得到对称分解,可能需要使用对称分解算法,或者对结果进行对称化处理。 另外,上述创建的张量T是否对称?我们示例中的T(i,j,k)=i+j+k,确实是对称的,因为任意两个下标交换,值不变(例如T(i,j,k)=T(j,i,k)等)。 但是,cp_als分解出的因子矩阵不一定相同,因为算法没有约束对称性。如果需要对称性约束,可以考虑使用其他方法,如对称张量分解(Symmetric Tensor Decomposition)。 然而,问题要求使用Kolda的cp_als,所以我们就直接使用。 如果张量确实对称,我们可以考虑使用分解结果的平均: 例如,因为对称,理论上三个因子矩阵应该相同,所以我们可以取三个因子矩阵的平均,然后重新构造一个对称的ktensor。 但是,请注意:cp_als分解出的三个因子矩阵可能并不相同,即使张量是对称的。这是因为对称CP分解通常要求三个因子矩阵相同,但cp_als没有这个约束,所以分解结果可能不是对称的。 因此,如果要求分解结果对称,我们需要在分解后处理:例如,将三个因子矩阵用它们的平均值代替,然后重新构造张量。 不过,问题没有要求分解结果对称,所以我们直接给出cp_als的用法。 以上代码假设已经安装了Tensor Toolbox(可从http://www.tensortoolbox.org/ 下载)。 如果没有安装,需要先下载并添加到路径。 注意:在创建张量时,我们使用的是简单的对称张量,实际使用时替换成你自己的张量。 最后,按照要求,在回答后提出3-5个相关问题: §§相关问题§§ 1. 如果张量是对称的,如何强制CP分解得到对称的因子矩阵? 2. 除了CP分解,还有哪些张量分解方法适用于对称张量? 3. 在MATLAB中,如何评估CP分解的拟合优度或分解质量? 4. 对于大规模对称张量,cp_als算法在计算效率上有哪些优化方法? </think>以下是用 MATLAB 实现三阶对称张量 CP 分解的代码,使用 Tensor Toolbox 中的 `cp_als` 函数: ```matlab % 加载 Tensor Toolbox addpath(&#39;路径/to/tensor_toolbox&#39;); % 替换为实际路径 % 创建三阶对称张量示例 (3×3×3) % 示例张量 T(i,j,k) = i+j+k (对称结构) dims = [3,3,3]; T_data = zeros(dims); for i = 1:dims(1) for j = 1:dims(2) for k = 1:dims(3) T_data(i,j,k) = i + j + k; % 对称张量示例 end end end T = tensor(T_data); % 转为 tensor 对象 % 设置 CP 分解参数 R = 2; % 设定分解秩 max_iter = 50; % 最大迭代次数 tol = 1e-6; % 收敛容差 % 执行 CP-ALS 分解 [decomp, ~] = cp_als(T, R, &#39;maxiters&#39;, max_iter, &#39;tol&#39;, tol); % 提取因子矩阵 A = decomp.U{1}; % 第一模态因子矩阵 B = decomp.U{2}; % 第二模态因子矩阵 C = decomp.U{3}; % 第三模态因子矩阵 % 重构张量并计算误差 T_recon = full(decomp); error = norm(T - T_recon) / norm(T); % 显示结果 fprintf(&#39;CP分解完成 (秩=%d)\n&#39;, R); fprintf(&#39;因子矩阵A:\n&#39;); disp(A); fprintf(&#39;因子矩阵B:\n&#39;); disp(B); fprintf(&#39;因子矩阵C:\n&#39;); disp(C); fprintf(&#39;重构误差: %.4e\n&#39;, error); ``` ### 关键说明: 1. **依赖工具**:需安装 [Tensor Toolbox v3.5+](http://www.tensortoolbox.org) 2. **对称处理**:虽然输入张量对称,但 `cp_als` 不强制输出因子矩阵相同(需后处理) 3. **参数调整**: - `R` 影响分解精度(值越大精度越高) - `max_iter` 和 `tol` 控制收敛 4. **输出格式**: - `decomp` 包含 λ(权重)和 U(因子矩阵) - CP 模型:$T \approx \sum_{r=1}^R \lambda_r \cdot (A_r \circ B_r \circ C_r)$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值