题目
编写程序,已有包含多个不同长度向量的元胞数组,使用高阶函数 <code>cellfun</code> 批量求解每个子向量的均值、求和与长度,彻底消除显式 for 循环。
输入格式:无需外部输入。
输出格式:输出原始非规则元胞数组及 cellfun 统计得到的数值向量。
数据范围与约定:cellfun 高阶函数。
思路与算法
1. 非规则结构的处理
矩阵无法存储每一行长度不等的锯齿数据,此时必须用元胞数组 {v1, v2, v3}。
2. cellfun 机制cellfun(@func, C) 对元胞中的每个单元并发调用函数句柄,并将标量返回值聚合成标准数组输出。
3. UniformOutput 控制
若映射函数返回的是非标量或复杂类型,需追加参数 "UniformOutput", false 返回新的元胞数组。
完整程序
% Octave / MATLAB 第75题:cellfun 批量映射
% 锯齿型非规则元胞数据 (不同长度向量)
data_cells = {
[1, 2, 3],
[10, 20, 30, 40, 50],
[5, 5]
};
% 使用 cellfun 一次性批量计算长度、求和与均值
lens = cellfun(@length, data_cells);
sums = cellfun(@sum, data_cells);
means = cellfun(@mean, data_cells);
fprintf("原始元胞包含 %d 组不同长度序列\n", length(data_cells));
for i = 1:length(data_cells)
fprintf(" 序列 %d: %s\n", i, mat2str(data_cells{i}));
end
fprintf("\ncellfun 批量统计结果 (直接返回标准向量):\n");
fprintf("各组长度: %s\n", mat2str(lens));
fprintf("各组累加和: %s\n", mat2str(sums));
fprintf("各组均值: %s\n", mat2str(means));运行示例
输出:
原始元胞包含 3 组不同长度序列
序列 1: [1 2 3]
序列 2: [10 20 30 40 50]
序列 3: [5 5]
cellfun 批量统计结果 (直接返回标准向量):
各组长度: [3;5;2]
各组累加和: [6;150;10]
各组均值: [2;30;5]