Нахождение строк, которые имеют одинаковые строки и другие элементы в массиве ячеек в MATLAB
Предположим, у меня есть массив ячеек в MATLAB следующего типа:
Station_Name Node_Number Generation_type Generated_Power (MW)
Barry 5 Gas 120
Brigg 3 Nuclear 135
Brixton 1 Gas 110
Shoreham 2 Solar 90
Kelsey 5 Gas 85
Jinnie 4 Nuclear 65
Pollock 2 Gas 150
Surret 2 Gas 160
(Фактическая проблема содержит гораздо больше станций, узлов и типов генерации, хотя я пишу это здесь для упрощения).
Я хочу отсортировать данные в массив следующего типа:
Node_Number Generation_type Total_Generated_Power
1 Solar
1 Gas
2 Hydro
2 Gas
.
.
.
3
4
5
Поэтому я хочу создать скрипт, который будет автоматически создавать массив с отдельной строкой для каждого типа генерации, для каждого из узлов массива ячеек (на самом деле более 5 узлов и более 3 типов генерации).
Сначала я подумал, что мне нужно создать цикл for, который будет первоначально проверять элементы, которые являются одинаковыми во втором столбце, и для этих элементов строки в третьем столбце будут сравниваться, чтобы увидеть, какие из них одинаковые. Затем для тех станций, которые совместно используют один и тот же тип генерации в одном и том же узле, их генерируемая мощность будет складываться вместе. Затем в качестве нового массива необходимо будет создать новую переменную, которая будет содержать общую генерируемую мощность для каждого типа в каждом узле.
Цикл for будет инициализирован от 1 до максимального числа узлов и будет проверять каждую из строк массива. Использование strcmp
для нахождения станций, которые разделяют одну и ту же строку, т.е. того же типа генерации, также следует использовать, насколько я понимаю.
Любые советы о том, как подойти к этому, будут очень полезны. Заранее спасибо за ваше время.
1 ответ
Это должно сделать трюк:
% Sample data...
C = {
'Barry' 5 'Gas' 120;
'Brigg' 3 'Nuclear' 135;
'Brixton' 1 'Gas' 110;
'Shoreham' 2 'Solar' 90;
'Kelsey' 5 'Gas' 85;
'Jinnie' 4 'Nuclear' 65;
'Pollock' 2 'Gas' 150;
'Surret' 2 'Gas' 160
};
% Create a table from the cell matrix...
T = cell2table(C,'VariableNames',{'StationName' 'NodeNumber' 'GenerationType' 'GeneratedPower'});
% Generate a grouping for the table based on the 2nd and 3rd columns...
[G,NodeNumber,GenerationType] = findgroups(T.NodeNumber,T.GenerationType);
% Apply the sum function using a group-wise approach...
TotalGeneratedPower = splitapply(@sum,T.GeneratedPower,G);
% Create a new table with the result...
result = table(NodeNumber,GenerationType,TotalGeneratedPower);
% Sort the new table according to the first two columns...
result = sortrows(result,[1 1])
Выход:
NodeNumber GenerationType TotalGeneratedPower
__________ ______________ ___________________
1 'Gas' 110
2 'Gas' 310
2 'Solar' 90
3 'Nuclear' 135
4 'Nuclear' 65
5 'Gas' 205
Для получения дополнительной информации о функциях, используемых в коде, обратитесь к следующим страницам официальной документации Matlab: