Octave中单元格数组行过滤后赋值为何表现不一致?
Octave单元格数组索引赋值与返回的异常问题解析
问题现象
测试代码如下:
function result = testcellarray() mycell = {'foo1' 'foo2' 'foo3'; 'barbar1' 'barbar2' 'barbar3'; 'yuzz1' 'yuzz2' 'yuzz3'}; idx = [1; 3]; % 直接执行会输出预期结果 mycell{[1:3], 2} % 赋值给变量后返回结果不符 result = mycell{[1:3], 2} end
运行输出:
octave:221> testcellarray() ans = foo2 ans = barbar2 ans = yuzz2 result = foo2 ans = foo2
直接执行mycell{[1:3], 2}会依次输出三个目标元素,但赋值给result后返回,仅得到第一个元素,还额外重复输出foo2。
原因解析
这是Octave(以及Matlab)中单元格数组索引的特性导致的:
- 用花括号
{}索引单元格数组时,若匹配多个元素,会返回多个独立的输出值,而非一个包含这些元素的单元格数组。 - 在命令行直接执行时,Octave会把多个输出依次打印出来,所以能看到三个元素。
- 但当赋值给单个变量
result时,只会捕获第一个输出值,剩余的输出会被当作函数的额外返回内容,因此函数结束时除了返回result=foo2,还会把剩下的未捕获输出赋值给ans,也就是额外出现的ans=foo2。
解决方法
要返回过滤后的单元格数组,应该使用**圆括号()**索引,它会返回原单元格数组的子数组,而非单独元素:
修改后的代码:
function result = testcellarray() mycell = {'foo1' 'foo2' 'foo3'; 'barbar1' 'barbar2' 'barbar3'; 'yuzz1' 'yuzz2' 'yuzz3'}; idx = [1; 3]; % 正确返回目标子单元格数组 result = mycell([1:3], 2); end
执行后会返回包含foo2、barbar2、yuzz2的列单元格数组,完全符合预期。
如果需要用花括号获取元素并打包,也可以通过捕获多输出的方式实现,但不如圆括号索引简洁:
[result{1:3}] = mycell{[1:3], 2};
Matlab中的表现
在Matlab中,直接执行mycell{[1:3],2}同样会依次输出三个元素,但赋值给单个变量时,Matlab会直接报错(不允许存在未捕获的多输出),不会出现Octave里额外输出ans的情况,但核心的“花括号多索引返回多输出”特性是一致的。
内容的提问来源于stack exchange,提问作者M.E.
相关产品推荐
相关产品推荐

