1

在 Matlab 中,我有一个大矩阵 A。矩阵的第一列包含以秒为单位的时间。第二至第 13 列包含计算结果。对于每一列(第一列除外),我通过以下方式计算了晶须:

分位数(A,[.75])-1.5*(分位数(A,[.75])-分位数(A,[.25]))

现在我想知道每列中有多少异常值(=低于晶须的值),以及它们何时发生。这将使我能够计算出异常值随时间的分布情况。

我更喜欢创建一个循环,它给我 12 个包含两列的矩阵。第二列应包含异常值的值(= 晶须下方单元格的值),中间没有任何零,第一列应包含异常值发生的时间(按时间顺序)。

我怎样才能创建这个?

问候,

文森特

4

2 回答 2

1

无需循环:改用矩阵运算和逻辑索引。

假设您有一个矩阵A并且异常值阈值thr是 a 1x12 vector,每列的阈值是:

vals = A(:,2:13);
outliers = bsxfun(@lt, vals, thr); #% @lt is 'less than' function handle
#% outliers is a Nx12 logical matrix with true(1) where the value < threshold
#% and false(0) otherwise.

要获取这些异常值发生的时间(对于给定的列,假设column 2原始矩阵的数据部分):

t = A(outliers(:,2), 1);
#%    ^____________ logical index of rows where outliers occurred in that column 

您还可以通过求和轻松获得每列(或行)中异常值的数量:

num_outliers = sum(outliers,1); 
于 2013-02-14T15:24:12.220 回答
1

让,

A =

    0.6260    0.7690    0.1209    0.5523    0.0495
    0.6609    0.5814    0.8627    0.6299    0.4896
    0.7298    0.9283    0.4843    0.0320    0.1925
    0.8908    0.5801    0.8449    0.6147    0.1231
    0.9823    0.0170    0.2094    0.3624    0.2055

对于第二列:

B = quantile(A(:,2),[.75])-1.5*(quantile(A(:,2),[.75])-quantile(A(:,2),[.25]))

然后,

index = find(A(:,2) < B)

value_outliner = A(index,2)
outliner_time = A(index,1)
于 2013-02-14T15:24:19.627 回答