【问题标题】:Combining overlapping matrix data to create a single matrix组合重叠矩阵数据以创建单个矩阵
【发布时间】:2020-03-23 12:34:09
【问题描述】:

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

【问题讨论】:

  • 请编辑您的代码,以便定义输入变量(示例值),并指明所需的输出是什么

标签: matlab matrix large-data


【解决方案1】:

首先我们生成一些样本输入数据。请注意,此数据位于允许我们循环遍历传感器的数据结构中,而不是为四个传感器中的每一个编写单独的代码。

% 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) = cs(Id, It) + sensors.cs{s}; cs(Id, It) = sensors.cs{s};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2013-06-18
    • 2016-12-21
    相关资源
    最近更新 更多