如何无for循环向量化实现矩阵列向量的f映射求和?
向量化实现逐列映射f后求和的方案
针对你的需求,这里提供两种向量化实现思路,取决于函数f是否支持批量处理矩阵输入:
情况1:f已支持向量化输入
如果f可以直接接收2×m的矩阵(即同时处理所有二维列向量),并输出n×m的矩阵(每列对应原X列的f计算结果),那直接用一行代码就能完成:
function img = g(X) img = sum(f(X), 2); end
逻辑说明
f(X)会对输入矩阵X的每一列独立执行映射,生成n行m列的结果矩阵;sum(..., 2)指定沿着**第二个维度(列维度)**求和,将矩阵中每一行的m个元素累加,最终得到n×1的结果向量,和原循环版本的输出完全一致。
情况2:f仅支持单个二维向量输入
如果f只能处理2×1的单个向量,无法直接接收矩阵,可以用arrayfun替代显式for循环,实现更简洁的向量化风格代码:
function img = g(X) [~, m] = size(X); % 遍历X的每一列,调用f并存储结果到细胞数组 f_cell = arrayfun(@(idx) f(X(:, idx)), 1:m, 'UniformOutput', false); % 将细胞数组转换为矩阵后求和 img = sum(cell2mat(f_cell), 2); end
逻辑说明
arrayfun会自动遍历索引1到m,对每个索引提取X的对应列传入f;UniformOutput设为false是因为f返回的是向量,需要用细胞数组存储;cell2mat将存储各列结果的细胞数组转换为n×m的矩阵,再通过sum(...,2)完成累加。
额外建议
如果可以修改f的实现,优先将其改造为支持向量化输入的版本——Matlab的向量化原生操作效率远高于循环(包括arrayfun底层的隐式循环),比如将f中针对单个向量的元素级操作,改成按列处理的矩阵操作,能大幅提升大矩阵输入时的运行速度。
内容的提问来源于stack exchange,提问作者Kilkik
相关产品推荐
相关产品推荐

