了解structfun()或cellfun()命令

11个视图(过去30天)
杰克逊·科克
杰克逊·科克 2021年4月23日
回答: 史蒂芬 2021年4月24日
亲爱的各位,
我希望通过使用structfun()和cellfun()命令来避免使用for循环。
我有一个文件夹,里面有一堆“nnn_M.csv”文件,其中“nnn”前缀对应于文件的编号,“M”后缀对于所有文件都是常量。我的目标是创建一个“nnn”值的双数组。
我当前与for循环一起使用的代码:(有效)
Files=dir(“*.csv”);%创建文件描述的结构(名称、日期等)
N=长度(文件);%已确定for循环的文件数
对于ii=1:N
FileNames{ii}=文件(ii).name;%创建文件名的单元格数组
nnn(ii)=sscanf(文件名{ii},“%d\M”);%创建文件前缀的双数组
终止
这是没有for循环的代码:(不工作)
Files=dir(“*.csv”);%创建文件描述的结构(名称、日期等)
FileNames=structfun(@(x)个文件(x).name,个文件);%创建文件名的单元格数组
nnn=cellfun(@(x)sscanf(文件名{x}),“%d\M”),文件名);%创建文件前缀的双数组
第二行和第三行分别给出了错误:
错误使用structfun
投入to STRUCTFUN必须是标量结构。
%及
指数超过数组元素数(14)。
错误在@(x)sscanf(文件名{x},'%dK')
%当使用正确的“文件名”时,for循环给出
%文件夹中有14个*.csv文件
我欢迎您提出的所有建议。感谢您帮助我理解这些功能!
干杯
-杰克逊

公认的答案

dpb
dpb 2021年4月24日
正如错误消息和文档所说, 结构乐趣 将函数应用于每个 领域 在标量结构中,您有一个结构数组——不是您想要的。
而且,对于特定的需求,您不需要函数或循环构造——使用MATLAB矢量化符号--
nums=str2double(extractBefore(字符串({Files.name})),'_'));
2评论
dpb
dpb 2021年4月24日
1) 试试命令行,看看有什么 Files.name 返回。(提示:在文档中搜索“逗号分隔列表”)
2) 由于第一次失败,我不知道您尝试时单元格数组的内容是什么,因此无法说出具体内容,但可能您的数组比预期的小,并且传递了不一致的数组
3a)当然可以,但为什么?您希望避免循环; 赛尔芬 是披着羊皮的环;在它下面是一个循环,它的开销比直接循环要大 结束 建筑当然,它有自己的位置,但并不总是更好的解决方案。但是,为了举例说明
>>赛尔芬(s)南昌(s),“%d\M”),{Files.name})
ans=
0 1.00
>>
3b)如上所示,您可以编写一个匿名函数来代替函数句柄——它可以是任何一行表达式。或者,如果您无法在一行中管理它,请使用您编写的m-file函数的句柄。注意:匿名函数的一个特点是,它可以将任何工作空间变量嵌入函数体中的参数列表之外--通过以下方法可获得与上述相同的结果:
>>arrayfun(@(i)sscanf(Files(i).name,“%d\M”),1:numel(文件))
ans=
0 1.00
>>
其中文件结构嵌入到匿名函数中。虽然这里不是最优的,但当需要其他参数来评估函数时,这可能非常有用。

登录以发表评论。

更多答案(1)

史蒂芬
史蒂芬 2021年4月24日
避免CELLFUN或STRUCTFUN更简单、更高效:
S=dir(“*M.csv”);
V=sscanf([S.name],“%f_M.csv”)
五= 3×1
1.2000 3.4000 5.6000

下载188bet金宝搏


释放

R2020a

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始打猎吧!