在 MATLAB 的元胞数组中定位共享相同字符串和其他元素的行
Locating rows which share same strings and other elements in a cell array in 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
来查找共享相同字符串的站点,即相同的生成类型也应该被使用。
有关如何处理此问题的任何提示都将非常有帮助。预先感谢您的宝贵时间。
这应该可以解决问题:
% 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官方文档的以下页面:
假设我在 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
来查找共享相同字符串的站点,即相同的生成类型也应该被使用。
有关如何处理此问题的任何提示都将非常有帮助。预先感谢您的宝贵时间。
这应该可以解决问题:
% 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官方文档的以下页面: