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 元数据的主要内容,如果未能解决你的问题,请参考以下文章

DICOM 未定义标签长度,PIXEL

python 读取dicom tag 结果为空值

matlab练习程序(求向量间的旋转矩阵与四元数)

matlab练习程序(对应点集配准的四元数法)

matlab练习程序(对应点集配准的四元数法)

Matlab 编码器和动态字段参考