胞元数组批量化操作函数cellfun 20170317

本文详细介绍了MATLAB中函数cellfun的使用方法,包括如何对细胞数组中的每个元素应用指定的操作,以及通过设置UniformOutput参数来控制输出格式。此外,还展示了如何处理不同大小的输入数组并提供了错误处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数 cellfun

功能 对胞元数组中的每个元素进行相同的操作

格式 

[A1,A2,A3...Am] = cellfun(func,C1,...,Cn)

[A1,A2,A3...Am] = cellfun(func,C1,...,Cn,Name,Value)

备注

格式二中 Name,Value对中Name 可选为‘UniformOutput’和‘ErrorHandler’

Uniformoutput

true 将输出整合为一个数组

C = {rand(3),rand(3),rand(3)};
fcn = @mean;
cellfun(fcn,C,'UniformOutput',true)

false 输出为胞元数组

C = {rand(3),rand(3),rand(3)};
fcn = @mean;
cellfun(fcn,C,'UniformOutput',false)


输出中m对应于函数的操作,但每个输出的维度与n相同

C = {rand(3),rand(3),rand(3)};

[nRows,nCols] = cellfun(@size,C)

cellfun(@size,C,'UniformOutput',false)


对字符串的统一操作

days = {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'};

abbrev = cellfun(@(x) x(1:3), days, 'UniformOutput', false)

error handle

主函数

A = {rand(3)};
B = {rand(5)};
AgtB = cellfun(@(x,y) x > y, A, B, 'ErrorHandler', @errorfun, ...
               'UniformOutput', false)

错误处理函数

function result = errorfun(S, varargin)
   warning(S.identifier, S.message);
   result = 1;%NaN;
end


### MATLAB 数组操作使用教程 #### 一、创建和初始化数组 MATLAB 提供了多种方式来创建和初始化数组。可以使用内置函数或者直接输入数据。 - 创建简单的一维数组可以通过方括号 `[]` 来实现,素之间用逗号或空格分隔。 ```matlab A = [1, 2, 3]; % 或者 A = [1 2 3]; ``` - 对于多维数组,则可以在不同维度间使用分号`;`分割: ```matlab B = [1, 2; 3, 4]; % 创建一个2x2矩阵 ``` 为了更灵活地定义大小未知的数组,在某些情况下可能希望动态构建它们,这时可以用到冒号运算符 `:` 和其他辅助工具[^1]。 #### 二、访问与索引 一旦有了数组之后就可以对其进行各种形式的操作,比如获取特定位置上的值或是子集等。这通常涉及到下标(Indexing),即指定想要取出的数据的位置。 - 单个素可通过其行列坐标来选取;对于更高维度的情况则需给出完整的索引列表。 ```matlab element = B(1, 2); % 获取第1行第2列的素 ``` - 若要提取整个行/列或其他部分,则可利用冒号表示法简化书写过程。 ```matlab row_vector = B(:, 1); % 所有行的第一列组成的新向量 column_vector = B(1, :); % 第一行的所有列组成的新向量 submatrix = B([1 2], [1]); % 多重索引来获得子矩阵 ``` 当处理大型或多维结构化数据集合时,掌握好这些技巧是非常重要的[^2]。 #### 三、基本变换及算术运算 除了简单的读写之外,还可以执行一系列常见的线性代数计算以及其它类型的转换工作。 - 加减乘除四则运算是最基础也是最常见的需求之一,可以直接应用于两个相同尺寸的数组上。 ```matlab C = A .* B'; % 点乘对应位相乘的结果 D = sum(A); % 计算所有素之和 E = mean(B(:)); % 平均值求解 F = sortrows(C);% 行排序 G = reshape(D, [], 2); % 改变形状而不改变总数量 H = repmat(G, 2, 1); % 将现有模式重复复制形成新的更大规模版本 I = zeros(size(H)); % 初始化全零阵作为临时存储空间 J = ones(length(I), length(I)+1)*pi;% 构建特殊常数值填充表单 K = eye(numel(J)/length(J)); % 身份单位矩阵生成器 L = randperm(max(K(:))); % 随机排列整数序列 M = diag(L); % 抽取对角线上面的成分构成新矢量 N = blkdiag(M, M+min(N)); % 组合多个小型块状体成大整体框架 O = sparse(P); % 密度较低情形下的高效表达方法 P = full(O); % 返回密集型副本以便后续进一步加工 Q = cellfun(@numel, R); % 应用于单格内的每一个成员对象身上 R = struct('field', {S}); % 定义带有字段属性记录信息容器 S = table(T{:,:},'VariableNames',{'V1','V2'});% 制作表格样式视图便于查看分析 T = timetable(datetime(V,'ConvertFrom','datenum'),'RowTimes',U);% 时间戳关联关系建立起来方便追踪变化趋势 U = V.'; % 转置操作使得原本横向布局变为纵向展示形态 V = W.^(-0.5); % 求平方根逆运算得到最终结果输出显示 W = X ./ Y; % 向量化比例缩放因子调整适应范围限制条件 X = Z .^ (size(Z)-ones(size(Z))); % 自幂次方扩展放大效应模拟实验测试验证效果如何 Y = round(X); % 四舍五入保留有效数字精度等级设定合理区间边界控制 Z = fix(Y); % 截断浮点数只留下整数部分去除多余小数尾巴端点 ``` 以上仅列举了一些典型例子,并不是全部可能性。实际应用中可根据具体场景选择合适的方法来进行相应的数学运算和逻辑判断。 #### 四、高级特性——动态命名与间接寻址 有时会遇到需要根据程序运行状态自动生成变量名或将字符串解析为有效的MATLAB命令的情形。此时便要用到了所谓的“编程”技术。 - 动态创建具有相似特征但又互不相同的系列变量,例如迭代过程中产生的中间产物保存下来待以后再做统一汇总统计用途。 ```matlab for i=1:5, eval(['var_' num2str(i) '=[i,i*i];']); end; disp(var_3); ``` 不过需要注意的是这种方法虽然直观易懂却也容易引发混淆错误难以维护管理,因此除非必要否则应尽量避免采用这种方式而倾向于更为稳健可靠的替代方案如cell array或struct structure等复合类型。 #### 五、实用技巧——批量赋初值&按规则补足缺失项 针对那些预先不知道确切长度却又希望能够快速完成初步设置的任务来说,“预分配内存”的做法往往能带来显著性能提升优势。 - 使用`zeros()`, `ones()` 函数提前规划好数组的空间分布情况从而减少不必要的重新分配开销成本。 ```matlab pre_allocated_array=zeros(1e6,1); for idx=1:length(pre_allocated_array), pre_allocated_array(idx)=idx*randn(); end; ``` 另外还有专门用来填补空白处使之满足既定规格要求的功能模块可供选用,这对于图像修复等领域尤为有用[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值