gpt4 book ai didi

arrays - 如何计算矩阵中值(正常运行时间)连续出现的长度?

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:29 26 4
gpt4 key购买 nike

我有这样的数据:

 1     0     1
1 1 1
0 1 1
1 1 1
1 1 1
1 1 1
1 1 0
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
0 0 1
1 1 1
1 1 1
1 1 1

每一列代表一个设备,每一行代表一个时间段。每个数据点表示设备在该时间段内是否处于事件状态。我正在尝试计算每个设备处于事件状态的每个正常运行时间或“咒语”的长度。换句话说,每列中连续的每个拼写的长度。在这种情况下,第一列将是 2 11 3,依此类推。

这很容易用一台设备(单列数据)完成:

rng(1)

%% Parameters
lambda = 0.05; % Pr(failure)
N = 1; % number of devices
T = 18; % number of time periods in sample

%% Generate example data
device_status = [rand(T, N) >= lambda ; false(1, N)];

%% Calculate spell lengths, i.e. duration of uptime for each device
cumul_status = cumsum(device_status);

% The 'cumul_status > 0' condition excludes the case where the vector begins with one
% or more zeros
cumul_uptimes = cumul_status(device_status == 0 & cumul_status > 0);
uptimes = cumul_uptimes - [0 ; cumul_uptimes(1:end-1)];

所以我可以简单地遍历列并一次执行这一列,并使用 parfor(例如)并行运行它。有没有办法使用矢量化矩阵运算同时跨所有列执行此操作?

编辑:我应该补充一点,由于每台设备的正常运行时间可能不同,所以这很复杂。

最佳答案

这是一个方法。不过,不确定它是否算作矢量化。

让您的数据矩阵表示为x。然后

[ii, jj] = find([true(1,size(x,2)); ~x; true(1,size(x,2))]);
result = accumarray(jj, ii, [], @(x){nonzeros(diff(x)-1)});

生成一个元胞数组,其中每个元胞对应一列。在你的例子中,

result{1} =
2
11
3
result{2} =
13
3
result{3} =
6
11

这是如何运作的

想法是在x中找到零的行和列索引(即~x中的true值),并且然后使用列索引作为分组变量(accumarray 的第一个参数)。

在每个组中,我们使用 anonymous function @(x){nonzeros(diff(x)-1)} 计算零的行位置的差异。我们可以申请diff直接因为来自 find 的列索引已经排序,感谢 Matlab 的 column major命令。我们减去 1,因为 x 中的零不计入正常运行时间;删除等于 0 的正常运行时间长度(使用 nonzeros ),并将生成的向量打包到一个单元格中 ({...})。

一行 true 值被附加到 ~x 前面,以确保我们检测到初始和最终正常运行时间。

关于arrays - 如何计算矩阵中值(正常运行时间)连续出现的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34520901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com