matlab的setfield函数是给结构数组的字段指定值的。有以下两种调用方式:

s = setfield(s,'field',value)
s = setfield(s,{sIndx1,...,sIndxM},'field',{fIndx1,...,fIndxN},value)

第一种就不说了,第二种先看一个程序:

grades = [];
level = 5;
semester = 'Fall';
subject = 'Math';
student = 'John_Doe';
fieldnames = {semester subject student}
newGrades_Doe = [85, 89, 76, 93, 85, 91, 68, 84, 95, 73];

grades = setfield(grades, {level}, ...
                  fieldnames{:}, {10, 21:30}, ... 
                  newGrades_Doe);

grades = setfield(grades, {level}, fieldnames{:}, {10,':'}, []);

这个是啥意思呢?看得有点懵逼。 结构体标1x5struct就是说这个结构体有5个记录,setfield(grades, {level},fieldnames{:}, {10, 21:30}, newGrades_Doe); 就是说让结构数组grades的第5(level)个记录的“Fall”字段的“Math”字段的“John_Doe”字段(fieldnames{:})的那个值的第10行的21列到30列赋值为[85, 89, 76, 93, 85, 91, 68, 84, 95, 73](newGrades_Doe)。这是个结构体的层层嵌套。输入:

grades(level).(semester).(subject).(student)(10, 21:30)

就能返回“newGrades_Doe”,即:

ans =

    85    89    76    93    85    91    68    84    95    73

那么这里的元胞数组“fieldnames{:}”怎么理解呢?其实就是逗号隔开的不同元素而已,也就是说:

setfield(grades, {level},fieldnames{:}, {10, 21:30}, newGrades_Doe);

等价于

setfield(grades, {level},fieldnames{1},fieldnames{2},fieldnames{3}, {10, 21:30}, newGrades_Doe);

grades = setfield(grades, {level}, fieldnames{:}, {10,’:’}, []);就是将赋值的那几个数所在的那一行去掉。matlab中没有的东西,你再赋值就会强制产生这个东西。有的东西,赋空就会去掉。

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐