要计算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])
但是很遗憾,我无法使用正确的字符串进行索引...
答案 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);