使用动态数组访问结构以建立索引

时间:2019-02-19 00:25:09

标签: matlab indexing structure

要计算2D结构系统的整体质量,我已获得有关每个结构组件的面积,属性(存储在“ props”结构阵列中)和材料(存储在“ mats”结构阵列中)的信息

我可以循环计算元素的总数,并按面积*厚度*密度分别计算质量,但我希望这样做而不必使用for循环。

% This is the database
area = [100 300 500];

props.shell(1).thic = 5;
props.shell(2).thic = 10;

mats.alu(1).rho   = 10;
mats.alu(2).rho   = 15;
mats.steel(1).rho = 20;
mats.steel(2).rho = 25;

例如,如果我要计算元素1和3的质量,则确定以下查找表:

% beforehand computed field names and indices
a_idx  = [1 3] 

p_name = {'shell' 'shell'};
p_idx  = [1 2];

m_name = {'alu' 'steel'};
m_idx  = [2 1];

% this works
mass = 0;
for i = 1 : numel(a_idx)
    mass = mass + area(a_idx(i)) * props.(p_name{i})(p_idx(i)).thic * mats.(m_name{i})(m_idx(i)).rho
end

这就是我想要的工作方式:)

mass = sum(area(a_idx) .* [props.(p_name)(p_idx).thic] .* [mats.(m_name)(m_idx).rho])

我已经尝试过

mass = sum(area(a_idx) .* [props.(p_name{:})(p_idx).thic] .* [mats.(m_name{:})(m_idx).rho])

但是很遗憾,我无法使用正确的字符串进行索引...

1 个答案:

答案 0 :(得分:2)

您试图将dynamic field references与字段名称的单元格数组一起使用的事实是这里的症结所在。确实并没有很好的速记符号。我能想到的唯一选择是使用struct2cell将顶层结构数组转换为单元格数组,但这会创建看起来更为复杂的方法,所有这些方法都避免了非常简单且诚实的for循环,可能更有效。

如果您感到好奇,这是避免for循环的样子:

% Get thickness:
propData = struct2cell(props);
[~, index] = ismember(p_name, fieldnames(props));
propData = vertcat(propData{index});
thickness = [propData(sub2ind(size(propData), 1:numel(p_name), p_idx)).thic];

% Get density:
matData = struct2cell(mats);
[~, index] = ismember(m_name, fieldnames(mats));
matData = vertcat(matData{index});
density = [matData(sub2ind(size(matData), 1:numel(m_name), m_idx)).rho];

% Calculate mass:
mass = sum(area(a_idx).*thickness.*density);
相关问题