Octave中的deal函数无法正常工作

3
我有一个 .m 文件,它在 Matlab 中编写并且运行正常,但是当我尝试在 Octave 中运行它时,出现了错误。我知道这两个程序有所不同,只是不知道如何重新编写有问题的代码行以使其正常工作。
以下是代码。最后一行是引起问题的代码行:
dirr = '/my/file/path/'
foldlist = dir([dirr '*.wav']);
foldname={};
[foldname{1:length(foldlist),1}] = deal(foldlist.name)

这是运行时出现的错误:

error: Invalid call to deal.  Correct usage is:
-- Function File: [R1, R2, ..., RN] = deal (A)
-- Function File: [R1, R2, ..., RN] = deal (A1, A2, ..., AN)

似乎很简单,鉴于错误的解释,我只是不知道如何重新编写它。

尝试将{1:length(foldlist),1}替换为(1:length(foldlist),1) - Mad Physicist
我刚刚尝试了一下,但是没有成功。这是完全相同的错误信息。 - AmericanMade
请明确一下,foldlist.name是什么类型?你在这里具体处理的是什么? - Mad Physicist
foldlist 是一个结构体。我不确定 foldlist.name(显然我的 Matlab/Octave 技能不够好)。 - AmericanMade
1个回答

5
您应该能够完成以下操作:
foldname={foldlist.name};

这也是MATLAB中更好的方法。 foldlist.name 是一个逗号分隔值的列表。通过在其周围添加大括号,可以将它们捕获到单元格数组中。相当于 {a,b,c}
原始代码的问题在于,在初始化foldname={}后,索引foldname{1:length(foldlist),1}是不合法的。当在赋值的左侧超出边界时,MATLAB倾向于添加空单元格。Octave也是如此,但这里有方括号包围索引的数组,并且似乎Octave不以相同的方式解析这个特定部分。

3
文档中还提到:“编程提示:deal 经常用于由单元数组或结构体派生的逗号分隔列表。这是不必要的,因为解释器可以在没有函数调用的开销的情况下执行相同的操作。” - Mad Physicist
非常好的解释。+1 顺便说一句 - Mad Physicist
3
@MadPhysicist:确实,deal 函数已被引入,但不久后就被改进的语法取代了,变得无用。我想知道为什么它们还没有将其弃用。唯一有用的地方是在交换两个(或多个)值时:[a,b]=deal(b,a)。但我也从未需要过这种语法... - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接