Нахождение строк, которые имеют одинаковые строки и другие элементы в массиве ячеек в 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:

Другие вопросы по тегам