2017-02-15 57 views
1

я прыгну на вопрос первый, то какую-нибудь дополнительную информацию:Как я могу векторизовать доступ к подструктурам в Matlab?

Предположим, у меня есть следующие:

motor(1).Voltage = 96.2; 
motor(2).Voltage = 48.0; 

processingStation(1).FeedstockMotor.Voltage = 96.2; 
processingStation(2).FeedstockMotor.Voltage = 48.0; 

Ниже приведены все двигательные напряжения:

[motor.Voltage] 

Это не дают все напряжения двигателя:

[processingStation.FeedstockMotor.Voltage] 

Первый выход, [motor.Voltage], дает мне напряжения всех двигателей в конструкции. Как получить ту же функциональность в другом случае, где я пытаюсь сравнить значения Voltage для FeedstockMotor по всем processingStation s?

Я понимаю, что я мог бы переименовать поле FeedstockMotor_Voltage и получить ту же функциональность, но если разряд двигатель имеет аналогичный набор конфигураций, то я мог бы легко настроить двигатель по умолчанию, то есть что-то вроде:

defaultMotor.Voltage = 48.0; 
defaultMotor.Torque = 100; 

и т.д., и тогда я мог бы сделать легкие задания:

processingStation(1).FeedstockMotor = defaultMotor; 

Я хотел бы иметь очень небольшое подмножество допустимых двигателей, возможность установки весьма подробные конфигурации для этих двигателей, а затем быть в состоянии используй их.

Я также хотел бы иметь возможность нарезать различные сегменты, чтобы я мог быстро получить список рабочих крутящих моментов, напряжений и т. Д. Для визуальных трендов или других дисплеев HMI. Я бы предпочел не зацикливаться на всех элементах processingStation, чтобы получить нужные мне данные.

+1

Как первый ответ ниже показывает: ознакомьтесь с этими идеями: http://stackoverflow.com/questions/7878534/vectorization-of-multi-level-indexing-of-structs-in-matlab –

+0

Спасибо @Jon. Я просмотрел ответы на поставленный вами вопрос и решил, что с [удобочитаемым двухстрочным шрифтом] (http://stackoverflow.com/questions/42261541/how-can-i-vectorize-access-to-substructures-in- matlab? noredirect = 1 # comment71707455_42261575) стоит мне больше, чем тупой однострочный шрифт вроде 'squeeze (cell2mat (...))'. – Chuck

ответ

1

Вам необходимо сначала преобразовать processingStation.FeedstockMotor в массив структур, а затем вы можете получить доступ к полю Voltage результирующего массива.

tmp = [processingStation.FeedstockMotor]; 
result = [tmp.Voltage]; 

У меня есть функция на моем пути, что позволяет мне на самом деле получить доступ к этой подструктуре, как эта

function output = rgetfield(S, field) 
    % Split the fieldname on "." 
    parts = regexp(field, '\.', 'once', 'split'); 

    output = [S.(parts{1})]; 

    if numel(parts) > 1 
     % If there are more parts, recursively get them 
     output = rgetfield(output, parts{2}); 
    end 
end 

Вы можете использовать эту функцию как

values = rgetfield(processingStation, 'FeedstockMotor.Voltage'); 
+0

Мне не очень нравится использовать такую ​​временную переменную, но я полагаю, что это не конец света - я мог бы использовать что-то вроде FeedstockMotors = [processingStation.FeedstockMotor]; 'чтобы получить группу всех двигателей Мне все равно, а затем доступ к группам подполей; 'voltages = [FeedstockMotors.Voltage];' или 'currents = [FeedstockMotors.Current];' и т. д. Опять же, это все еще временная переменная, но это выглядит как самый ясный/самый читаемый способ достижения того, что я хочу, и это очень важно. – Chuck

+0

@Chuck В этом случае во временной переменной не так много вреда. При этом я просто добавил функцию, которую я использую для частого доступа к подструктурам. – Suever

 Смежные вопросы

  • Нет связанных вопросов^_^