matlab - 使用动态数组访问结构以进行索引
问题描述
为了计算二维结构系统的总质量,我获得了每个结构组件的面积、属性(存储在“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])
但遗憾的是,我无法正确使用字符串进行索引...
解决方案
您尝试将动态字段引用与字段名称元胞数组一起使用这一事实是这里的症结所在。真的没有很好的速记符号来做到这一点。我能想到的唯一选择是使用 将顶级结构数组转换为元胞数组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);
推荐阅读
- grails - Grails 3.3 字段插件 f:display 可以显示多对多
- javascript - 粘贴数据时没有触发onEdit
- python - 为什么我会收到 PEP 警告,要求我在这种情况下更改我的平等声明?
- javascript - 导航我的网站时,有没有办法阻止我的标题重新呈现?
- ubuntu - 如何将带有系统库的应用程序打包到 AppImage 中
- java - 如何使这个 testNG 测试动态但保持并行
- html - 选中复选框时更改样式 - Vue
- javascript - 烧瓶服务器从 JS 休息调用返回 400 错误代码
- python - 使用 for 循环来分隔表单集
只在表格之间,不在开头或结尾 - javascript - 向迭代器添加“return”方法的 JavaScript 无法正确关闭迭代器