结构和空单元格数组的MATLAB"bug"(或非常奇怪的行为)

Jas*_*n S 7 matlab cell-array matlab-struct

我不知道这里发生了什么.我正在使用R2006b.在我提交错误报告之前,任何有新版本的人都可以测试他们是否得到相同的行为?

代码:( bug1.m)

function bug1
S = struct('nothing',{},'something',{});
add_something(S, 'boing');          % does what I expect
add_something(S.something,'test');  % weird behavior
end

function add_something(X,str)
    disp('X=');
    disp(X);
    disp('str=');
    disp(str);
end
Run Code Online (Sandbox Code Playgroud)

输出:

>> bug1
X=
str=
boing
X=
test
str=
??? Input argument "str" is undefined.

Error in ==> bug1>add_something at 11
    disp(str);

Error in ==> bug1 at 4
add_something(S.something,'test');
Run Code Online (Sandbox Code Playgroud)

看起来像空虚/虚无S.something允许它移动函数调用的参数.这看起来像非常糟糕的行为.在短期内我想找到它周围(我正在尝试创建一个函数,将项添加到最初为空的单元格数组,该数组是结构的成员).

编辑:

推论问:所以没有办法构造一个struct包含任何空单元格数组的文字?

gno*_*ice 15

正如您已经发现的那样,这不是一个错误,而是一个"功能".换句话说,它是STRUCT函数的正常行为.如果将空单元格数组作为字段值传递给STRUCT,则假定您需要具有给定字段名称的空结构数组.

>> s=struct('a',{},'b',{})

s = 

0x0 struct array with fields:
    a
    b
Run Code Online (Sandbox Code Playgroud)

要将空单元格数组作为实际字段值传递,您将执行以下操作:

>> s = struct('a',{{}},'b',{{}})

s = 

    a: {}
    b: {}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,任何你想设置一个字段值使用STRUCT单元阵列时,您需要包括它在另一个单元阵列.例如,这将创建一个单独的结构元素,其中的字段包含单元格数组和向量:

>> s = struct('strings',{{'hello','yes'}},'lengths',[5 3])

s = 

    strings: {'hello'  'yes'}
    lengths: [5 3]
Run Code Online (Sandbox Code Playgroud)

但是这会创建一个包含两个结构元素的数组,分配单元格数组但复制矢量:

>> s = struct('strings',{'hello','yes'},'lengths',[5 3])

s = 

1x2 struct array with fields:
    strings
    lengths

>> s(1)

ans = 

    strings: 'hello'
    lengths: [5 3]

>> s(2)

ans = 

    strings: 'yes'
    lengths: [5 3]
Run Code Online (Sandbox Code Playgroud)