组合重叠矩阵数据以创建单个矩阵
Combining overlapping matrix data to create a single matrix
我有四个传感器的测量数据,每个传感器都给出给定水深 (d) 和时间 (t) 下的当前速度。下面是这四个电流测量的矩阵维度:
cs1 = [d1 x t1]; cs2 = [d2 x t2]; cs3 = [d3 x t3]; cs4 = [d4 x t4]
水深数组d1, d2, d3, d4
是唯一值,但它们的范围重叠。例如,d1=5:4:141
和 d2=72:2:200
。时间数组 t1,t2,t3,t4
也有不同的起点和终点以及不同的时间步长。
我需要创建一个组合矩阵 cs
,其中包含来自所有四个传感器的数据。为此,我创建了一个 NaN
矩阵:
t = unique([t1;t2;t3;t4]);
d = unique([d1 d2 d3 d4]);
cs = NaN(length(d),length(t));
% Populaitng data from 1st sensor
for i=1:length(d1)
for j=1:length(t1)
cs(d==d1(i) & t==t1(j))=cs1(i,j);
end
end
我正在使用 for
循环一次为一个仪器数据填充 cs
矩阵。这种方式效率很低,因为深度和时间数组的大小都非常大。
是否有更快的方法来填充 cs
矩阵,而无需 运行 每个仪器的 for
循环?
首先我们生成一些样本输入数据。请注意,此数据位于允许我们遍历传感器的数据结构中,而不是为四个传感器中的每一个编写单独的代码。
% sample input data
sensors = struct;
sensors.d = { ...
1:1:5; % d1
2:2:6; % d2
3:2:7; % d3
2:1:4; % d4
};
sensors.t = { ...
1:2:7; % t1
2:3:5; % t2
1:4:9; % t3
3:1:5; % t4
};
sensors.cs = { ...
1 * ones(length(sensors.d{1}), length(sensors.t{1})); % cs1
2 * ones(length(sensors.d{2}), length(sensors.t{2})); % cs2
3 * ones(length(sensors.d{3}), length(sensors.t{3})); % cs1
4 * ones(length(sensors.d{4}), length(sensors.t{4})); % cs2
};
然后我们将传感器数据组合成一个矩阵。从您的示例中不清楚您希望如何组合数据,因此我们假设您希望组合矩阵从全零开始,然后逐个元素地添加每个传感器的数据。
% COMBINE SENSOR DATA INTO SINGLE MATRIX
% dimensions
d = unique(cat(2, sensors.d{:}));
t = unique(cat(2, sensors.t{:}));
% initialize matrix
cs = zeros(length(d), length(t));
% loop over sensors
for s = 1 : length(sensors.cs)
% indexes of sensor's d and t dimensions in combined d and t dimensions
[~, Id] = ismember(sensors.d{s}, d);
[~, It] = ismember(sensors.t{s}, t);
% add the values to the combined matrix
cs(Id, It) = cs(Id, It) + sensors.cs{s};
end
例如,如果您想要从一个全 NaN 矩阵开始,并让每个元素代表添加了数据的最后一个传感器,您可以将行 cs = zeros(length(d), length(t));
替换为 cs = NaN(length(d), length(t));
以及带有 cs(Id, It) = sensors.cs{s};
.
的行 cs(Id, It) = cs(Id, It) + sensors.cs{s};
我有四个传感器的测量数据,每个传感器都给出给定水深 (d) 和时间 (t) 下的当前速度。下面是这四个电流测量的矩阵维度:
cs1 = [d1 x t1]; cs2 = [d2 x t2]; cs3 = [d3 x t3]; cs4 = [d4 x t4]
水深数组d1, d2, d3, d4
是唯一值,但它们的范围重叠。例如,d1=5:4:141
和 d2=72:2:200
。时间数组 t1,t2,t3,t4
也有不同的起点和终点以及不同的时间步长。
我需要创建一个组合矩阵 cs
,其中包含来自所有四个传感器的数据。为此,我创建了一个 NaN
矩阵:
t = unique([t1;t2;t3;t4]);
d = unique([d1 d2 d3 d4]);
cs = NaN(length(d),length(t));
% Populaitng data from 1st sensor
for i=1:length(d1)
for j=1:length(t1)
cs(d==d1(i) & t==t1(j))=cs1(i,j);
end
end
我正在使用 for
循环一次为一个仪器数据填充 cs
矩阵。这种方式效率很低,因为深度和时间数组的大小都非常大。
是否有更快的方法来填充 cs
矩阵,而无需 运行 每个仪器的 for
循环?
首先我们生成一些样本输入数据。请注意,此数据位于允许我们遍历传感器的数据结构中,而不是为四个传感器中的每一个编写单独的代码。
% sample input data
sensors = struct;
sensors.d = { ...
1:1:5; % d1
2:2:6; % d2
3:2:7; % d3
2:1:4; % d4
};
sensors.t = { ...
1:2:7; % t1
2:3:5; % t2
1:4:9; % t3
3:1:5; % t4
};
sensors.cs = { ...
1 * ones(length(sensors.d{1}), length(sensors.t{1})); % cs1
2 * ones(length(sensors.d{2}), length(sensors.t{2})); % cs2
3 * ones(length(sensors.d{3}), length(sensors.t{3})); % cs1
4 * ones(length(sensors.d{4}), length(sensors.t{4})); % cs2
};
然后我们将传感器数据组合成一个矩阵。从您的示例中不清楚您希望如何组合数据,因此我们假设您希望组合矩阵从全零开始,然后逐个元素地添加每个传感器的数据。
% COMBINE SENSOR DATA INTO SINGLE MATRIX
% dimensions
d = unique(cat(2, sensors.d{:}));
t = unique(cat(2, sensors.t{:}));
% initialize matrix
cs = zeros(length(d), length(t));
% loop over sensors
for s = 1 : length(sensors.cs)
% indexes of sensor's d and t dimensions in combined d and t dimensions
[~, Id] = ismember(sensors.d{s}, d);
[~, It] = ismember(sensors.t{s}, t);
% add the values to the combined matrix
cs(Id, It) = cs(Id, It) + sensors.cs{s};
end
例如,如果您想要从一个全 NaN 矩阵开始,并让每个元素代表添加了数据的最后一个传感器,您可以将行 cs = zeros(length(d), length(t));
替换为 cs = NaN(length(d), length(t));
以及带有 cs(Id, It) = sensors.cs{s};
.
cs(Id, It) = cs(Id, It) + sensors.cs{s};