【问题标题】:Error while trying to remove an element from a struct field尝试从结构字段中删除元素时出错
【发布时间】:2013-02-17 14:46:06
【问题描述】:

我在matlab 中有以下代码并试图从结构中删除一个元素:

function test()
    C = struct;
    C.(sprintf('Ck')) = [1 6 8 9; 8 6 9 7; 7 6 67 6; 65 7 8 7];
    ck_length = length(C.(sprintf('Ck')));
    for i=1:ck_length
        if C.(sprintf('Ck'))(i)> 10
           cleared = rmfield(C.(sprintf('Ck')), C.(sprintf('Ck'))(i));
        end
    end
end

但是,当我运行程序时,出现如下所示的错误:

>> test
??? Error using ==> rmfield at 19
S must be a structure array.

Error in ==> test at 89
   cleared = rmfield(C.(sprintf('Ck')), C.(sprintf('Ck'))(i));

我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 您是将C.Ck 视为矩阵还是向量?一旦丢弃大于 10 的元素,它的形状会发生什么变化?您是否有意使用numel 而不是length
  • 顺便说一句,下次尝试编辑您的问题,而不是删除并重新发布...

标签: matlab struct runtime-error


【解决方案1】:

要从数组中删除一个元素,您只需将其分配给一个空数组 ([]):

C.Ck(ii) = []; % removed the ii-th element of C.Ck.

几个cmets:

  1. 仅当您需要它们动态时才使用dynamic field names。如果字段名称始终为Ck,则使用C.Ck 访问它比使用C.(sprintf('Ck')) 更好。

  2. 尽量不要to use i and j as variable names in matlab

  3. 如果您在for 循环内使用ii 作为C.Ck 的索引,则在循环内更改C.Ck 的大小有点冒险。 (参见例如this question)。

  4. 如果你只想丢弃C.Ck中大于10的元素,你只需要

    C.Ck( C.Ck > 10 ) = [];
    

    cleared = C.Ck( C.Ck <= 10 );
    

【讨论】:

  • 有没有办法移除一个特定的元素?比如只有67?有没有办法做到这一点?我认为这会起作用:`C.Ck(C.Ck == 67) = []`?谢谢
  • @Med-SWEng - 你是对的。但是,如果删除单个元素,矩阵的形状会发生变化吗?在 Matlab 中尝试一下,看看会发生什么......
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多