为什么用空单元格构造一个MATLAB结构体对象,它会创建一个空结构体?

tnkciper  于 7个月前  发布在  Matlab
关注(0)|答案(2)|浏览(135)

我想构造一个具有三个属性的struct对象:

arg1 = 42;
arg2 = 'test';
arg3 = cell(0);

但是如果我尝试初始化这个对象:

struct('arg1', arg1, 'arg2', arg2, 'arg3', arg3);

它返回一个空的struct:

ans = 

  0×0 empty struct array with fields:

    arg1
    arg2
    arg3

我发现空单元格是罪魁祸首,所以如果我在没有空单元格的情况下初始化它,它会返回一个正确的值:

ans = 

  struct with fields:

    arg1: 42
    arg2: 'test'
    arg3: []

但是我需要我的代码来处理空单元格,我不知道它们是否在某个字段中,或者它们在哪里。
有办法解决这个问题吗?

yptwkmov

yptwkmov1#

@Wolfie对行为的解释是正确的。
解决方法是将数据放在单元数组中,如下所示:

>> struct('arg1', {arg1}, 'arg2', {arg2}, 'arg3', {arg3})

ans = 

  struct with fields:

    arg1: 42
    arg2: 'test'
    arg3: {}

这是因为文档中的这一行:

  • 如果任何值输入是非标量单元数组,则s与非标量单元数组具有相同的维数。

所以我们把所有的值输入单元数组。{arg3}{{}}相同,是一个单元数组,只有一个元素:一个空的单元数组。
请注意,可以使用以下语法创建结构体数组:

>> struct('arg1', {1,2,3}, 'arg2', {arg2}, 'arg3', {arg3})

ans = 

  1×3 struct array with fields:

    arg1
    arg2
    arg3

因为'arg1'参数是一个有3个元素的单元数组,所以创建的结构数组也有3个元素。具有单个元件的单元阵列在所有单元阵列中被复制。

8oomwypt

8oomwypt2#

这是documented行为:
s = struct(field,value)使用指定的fieldvalues创建一个结构数组。value输入参数可以是任何数据类型,如数字、逻辑、字符或单元数组。

  • 如果任何value输入是非标量单元数组,则s具有与非标量单元数组相同的维数。[...]
    *如果value是一个空的单元数组{},那么s是一个空的(0乘0)结构。要指定空字段并保留其他字段的值,请使用[]作为值输入

给你的外卖是最后一行。
为了解决这个问题,你必须做检查,比如

if iscell( argX ) && isempty( argX )
    argX = [];
end

如果你的结构中总是只有3个元素,那么这是相当简单的实现。

相关问题