组合重叠矩阵数据以创建单个矩阵

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:141d2=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};