通过传感器 ID 在 MATLAB 中拆分 table

Splitting a table in MATLAB by Sensor ID

我在 MATLAB 中有一个很大的 table,它包含 1000 多行数据,分为两列。第一列是收集数据的传感器的 ID,第二列是数据本身(在本例中是电压)。

我已经能够对我的 table 进行排序,以便将传感器的所有数据收集在一起。因此,传感器 1 的所有数据都在第 1 到 100 行,传感器 2 的数据在第 101 到 179 行,传感器 3 的数据在第 180 到 310 行,依此类推。换句话说,包含给定传感器数据的行数永远不会相同。

现在,我想将这个主要的 table 拆分为每个传感器 ID 的单独 table,但我很难找到一种方法来做到这一点。我想我可以用一个循环来完成它,我在其中循环遍历各种 ID,但这似乎不是一种非常 MATLAB 的方式。

完成此任务的有效方法是什么?或者循环真的是唯一的方法吗?

我附上了我的一些数据的小截图。

在这种情况下,for 循环很好,因为(我猜)没有那么多不同的传感器,而且您的代码很可能会将大部分时间花在处理数据上——循环不会给您带来重要意义开销。

假设你的 table 被称为 t,下面应该做你想要的。

unique_sensors = unique(t.sensor_id)

for i = 1:length(unique_sensors)
    sensor_data = t(t.sensor_id == unique_sensors(i), :);
    % save or do some processing on this data
end

您分享的屏幕截图显示了一个包含 2 个字段的 1244x1 结构数组,但问题描述的是一个 table。您可以使用

将结构数组转换为 table
T = struct2table(S);  % Assuming S is the name of your structure

无论变量是结构体还是table,最好不要分开变量,而是使用索引代替。例如,假设变量是 table,您可以使用

计算传感器 1 的平均电压
mean(T.reported_voltage(strcmp(T.sensor_id,'Sensor1')))

您可以使用

报告所有组的平均值
groupsummary(T,'sensor_id', 'mean')

splitapply(@mean,T.reported_voltage,findgroups(T.sensor_id))

但是,如果您绝对必须拆分和整理、组织良好的 table,您可以通过将 table 拆分为存储在元胞数组中的子 table 来实现使用,

unqSensorID = unique(T.sensor_id);
C = arrayfun(@(id){T(strcmp(T.sensor_id, id),:)},unqSensorID)