0

嗨,我需要一些有关 matlab 的帮助。

我有一个 500 x 360 的矩阵。下面是一个示例数据集:

10 10 12 11 9 8 8 25 26 26 20 20 20 
20 22 26 20 20 19 30 31 33 35 33 32
30 30 29 31 32 33 31 33 33 32 31 31
40 50 49 45 47 47 45 65 68 69 70 71

代码必须执行以下操作:

  1. 查找我指定的值的第一次出现,在本例中是 20% 的变化。因此观察 (1,:),第一次出现 20% 的变化是在第 2 列和第 3 列之间。
  2. 然后它识别出在步骤 1 中指定的值之后出现的最低值。在本例中是第 6 列(即值 8)。然后代码测量从步骤 1 中指定的值到步骤 2 中出现的最小值所经过的时间。回顾示例,20% 的 delta 为 (1,3) = 12,最小值出现在 delta 20% 之后是 (1,6) = 8。经过的时间是 3。
  3. 然后代码从步骤 2 中找到的最小值中找到最大值。在这种情况下,第 9 列的值为 26。它还记录了经过的时间。
  4. 最后,代码测量从第一个增量值到找到的最高值所经过的时间。在这种情况下,是从 (1,3) 到 (1,9) 的时间,即 6。

所以输出看起来像这样:

12  8   3   26  3   6
26  19  3   35  4   3
NaN NaN NaN NaN NaN NaN
50  45  2   71  8   10

我感谢您的帮助。非常感谢:)

4

1 回答 1

1

我现在无法访问 matlab。但这里有一些步骤可以帮助您入门。请仔细检查您的测试用例的答案,以查看您获得所需的结果。

假设您有一个行向量x。在你的情况下说i你的数据矩阵的第 th 行,即x = data(i,:);

现在要找到(比如说)20% 变化的第一次出现,您可以使用:

cI = find( x >= x(1)*1.2, 1, 'first' );

其中cI将是第一个值变化大于 20% 的索引,并且x(cI)是所需值。

next 找到这个值使用后的最小值

[minV, minI] = min(x( (cI+1):end ));

并在此之后找到最大值:

[maxV, maxI] = max(x( (cI+minI+1):end ));

最后把所有东西放在一起:

[x(cI), minV, minI, maxV, maxI, (minI + maxI)]

这将适用于您的第一行。现在对于第三行,您需要确保cI有一个值。如果cI为空,则只需使用NaN(1,6).

如果cI+1cI+minI+1超过元素的数量,将会有类似的错误检查。如果您正在寻找的更改发生得太晚,就会发生这种情况。

首先,您可以在每一行 ( ) 上设置一个for-loop i,但必须有更好的方法来矢量化代码。

整个设置为使用for-loop

% I have used generic variable names. Change them to something meaningful.
data = rand(500,360); % Use your data
change = 0.2;   % or 20/100 if you prefer percentage
[nROWS, nCOLS] = size(data);
result = NaN( nROWS, 6); % Defining it this way saves the trouble to having to assign NaNs

for row = 1:nROWS
    x = data( row, : );   % Not required, but easy to write code

    cI = find( x >= x(1)*(1+change), 1, 'first' );
    if isempty(cI)
        continue;
    end
    if cI == nCOLS  % no more elements to find min and max from
        result(row, 1) = x(cI);
        continue;
    end

    [minV, minI] = min(x( (cI+1):end ));
    if (cI + minI) == nCOLS % no more elements to find max from
        result(row, 1:3) = [x(cI), minV, minI];
    end

    [maxV, maxI] = max(x( (cI+minI+1):end ));
    result(row, :) = [x(cI), minV, minI, maxV, maxI, (minI + maxI)];
end
于 2012-11-27T03:11:58.177 回答