2017-02-15 35 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]給出了結構中所有電機的電壓。在另一種情況下,我如何獲得相同的功能,我試圖在所有processingStation s之間比較FeedstockMotorVoltage值?

我意識到,我可以重命名字段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 – 2017-02-16 03:20:46

+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];'獲得一組所有的電機我關心,然後訪問子域的組; '電壓= [FeedstockMotors.Voltage];''或'電流= [FeedstockMotors.Current];'等等。同樣,它仍然是一個臨時變量,但它看起來像是我想要的最清晰/最可讀的方式,這很重要。 – Chuck

+0

@Chuck在這種情況下臨時變量沒有太大的傷害。話雖如此,我只是添加了一個我用來頻繁訪問子結構的函數。 – Suever