Matlab:使用动态字段名编写 dicom 元数据
Posted
技术标签:
【中文标题】Matlab:使用动态字段名编写 dicom 元数据【英文标题】:Matlab: writting dicom metadata with dynamic fieldnames 【发布时间】:2021-08-03 19:17:19 【问题描述】:我正在尝试将 dicom 元信息写入 dicom 文件。在这里,字段名称会根据给定的元信息动态变化。
for j = 1:obj.pln.propStf.numOfBeams
eval(['meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.Item_' num2str(j) '.ReferencedBeamNumber = j;'])
eval(['meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.Item_' num2str(j) '.BeamDoseSpecificationPoint = [j,j,j];'])
eval(['meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.Item_' num2str(j) '.BeamDose = j;'])
eval(['meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.Item_' num2str(j) '.BeamMeterset = j;'])
eval(['meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.Item_' num2str(j) '.BeamDosePointDepth = j;'])
eval(['meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.Item_' num2str(j) '.BeamDosePointSSD = j;'])
end
正如您在meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.Item_' num2str(j) '.ReferencedBeamNumber = j;
中看到的那样,结构的字段名称会随着obj.pln.propStf.numOfBeams
中给出的光束数量而动态变化。
这种方法的问题是,如果我要尝试类似的东西:eval(['meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.Item_' num2str(j) '.ReferencedBeamNumber = 'TEST';'])
。 eval 函数尝试查找文本“TEST”。
所以问题是,对于给定的问题是否有不同的方法而不是使用 eval?
【问题讨论】:
我很困惑。是的,如果你使用eval('A')
,eval 将尝试使用A
。这很清楚。现在你的问题是什么?如何让eval
不寻找A
?好吧,不要在那里输入?它清楚你的代码问题是什么,但它根本不清楚你想要什么而不是。 eval 作为一个函数也是超级、超级、超级糟糕的,总有更好的选择。
在您的情况下,一个明确的替代方案是:meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.(['Item_' num2str(j)']).ReferencedBeamNumber = j;
您好@AnderBiguri Biguri,感谢您的快速回复。我正在寻找使用 eval 的替代方法。我尝试了 sprintf 但它给了你一个字符串。
我的第二条评论是 eval 的替代品,您可以按原样使用它。但是,它并不能解决您希望变量 TEST
不存在时存在的事实,这是您提出的问题。
@AnderBiguri 非常感谢您,您的第二条评论有效并且是解决方案!抱歉,TEST 不是变量,它是文本。我只是忘记了''。对不起。
【参考方案1】:
MATLAB 允许您使用字符串访问动态结构字段,而不是使用 eval
:
mystruct.hello=1;
mystruct.('hello')=1; % equivalent.
只是做:
meta.FractionGroupSequence.Item_1.ReferencedBeamSequence.(['Item_'num2str(j)']).ReferencedBeamNumber = j;
【讨论】:
以上是关于Matlab:使用动态字段名编写 dicom 元数据的主要内容,如果未能解决你的问题,请参考以下文章