3

这是我的初始结构数组:

A(1).B.C = 'a';
A(2).B.C = 'b';
A(3).B.C = 'a';
A(4).B.C = 'a';

我想C根据的值Values和索引更改字段的值IndexingArray

Values = {'a', 'b'};
IndexingArray = [1 1 0 1];

所以,我的新结构数组将是:

A(1).B.C = 'b';
A(2).B.C = 'b';
A(3).B.C = 'a';
A(4).B.C = 'b';

有没有办法在不使用 for 循环的情况下做到这一点?

4

2 回答 2

3

可以使用逗号分隔的列表语法在没有循环的情况下执行此操作deal,但它可能看起来有点难以阅读:

% Initialize A:
A(1).B.C = 'a';
A(2).B.C = 'b';
A(3).B.C = 'a';
A(4).B.C = 'a';
Values = {'a', 'b'};
IndexingArray = [1 1 0 1];

temp = [A.B];           % Structure array containing B substructures
[temp.C] = deal(Values{IndexingArray+1});  % Set field C of each structure element
temp = num2cell(temp);  % Convert to a cell array of 1-by-1 structures
[A.B] = deal(temp{:});  % Update B substructures

在较新版本的 MATLAB 中,您可以deal完全省略:

temp = [A.B];
[temp.C] = Values{IndexingArray+1};
temp = num2cell(temp);
[A.B] = temp{:};

这应该允许您更新BC字段,而不会影响更复杂结构中可能存在的任何其他字段。

于 2017-03-28T14:29:07.000 回答
1

与其更改值,不如重建结构数组更简单。

  • 通过以下方式获取价值IndexingArray

    val = Values(IndexingArray+1);
    
  • 使用 构建结构数组cell2struct,并使用 转换为元胞数组num2cell

    T = num2cell(cell2struct(val, {'C'}, 1));
    
  • 使用以下命令将T结果转换为结构数组cell2struct

    A = cell2struct(T', {'B'}, 1);
    

这是创建 A 的代码示例:

Values = {'a', 'b'};
IndexingArray = [1 1 0 1];

val = Values(IndexingArray+1);

T = num2cell(cell2struct(val, {'C'}, 1));

A = cell2struct(T', {'B'}, 1);

在一行代码中构建 A:

A = cell2struct((num2cell(cell2struct(Values(IndexingArray+1), {'C'}, 1)))', {'B'}, 1);

结果(用于测试):

>> A(1).B.C

ans =

b

>> A(2).B.C

ans =

b

>> A(3).B.C

ans =

a

>> A(4).B.C

ans =

b

解决方案使用arrayfun

val = Values(IndexingArray+1);

A = arrayfun(@(x) struct('B', struct('C', val{x})), 1:4)

更新 A 的特定元素:

如果您需要更新特定元素,而不是覆盖A,您可以arrayfun有选择地应用到索引,您知道您需要更新。

例子:

假设A长度为6个元素,并且需要更新前4个,可以使用如下代码:

A(1:4) = arrayfun(@(x) struct('B', struct('C', val{x})), 1:4);

假设您知道您只需要更新A(1)A(4),您可以使用以下示例:

A(1).B.C = 'a';
A(2).B.C = 'b';
A(3).B.C = 'a';
A(4).B.C = 'a';
A(5).B.C = 'c';
A(6).B.C = 'd';

Values = {'a', 'b'};
IndexingArray = [1 1 0 1];

val = Values(IndexingArray+1);

%List of indices of A to update
indices = [1, 4];

A(indices) = arrayfun(@(x) struct('B', struct('C', val{x})), indices);
于 2017-03-24T11:54:20.260 回答