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

我有来自四个传感器的测量数据,每个传感器给出给定水深(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循环?

wsetty 回答:合并重叠的矩阵数据以创建单个矩阵

首先,我们生成一些样本输入数据。请注意,这些数据的数据结构使我们可以遍历传感器,而不必为四个传感器中的每一个编写单独的代码。

% 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) = sensors.cs{s};

本文链接:https://www.f2er.com/3018250.html

大家都在问