доступ к структурам с использованием динамических массивов для индексации - PullRequest
0 голосов
/ 19 февраля 2019

Чтобы вычислить общую массу 2D структурной системы, я получил информацию о площади, свойствах (хранящихся в массиве "props" -структуры) и материале (сохраненном в массиве "mats -structure") каждого структурного компонента..

Я могу зациклить общее количество элементов и рассчитать массу индивидуально по площади * толщине * плотности, но хотел бы сделать это без использования цикла 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 голосов
/ 20 февраля 2019

Тот факт, что вы пытаетесь использовать динамические ссылки на поля с массивом ячеек с именами полей, является камнем преткновения.Там действительно нет хороших сокращенных обозначений, чтобы сделать это.Единственный вариант, который я могу придумать, - преобразовать структурный массив верхнего уровня в массив ячеек, используя 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...