MATLAB。在矩阵和循环中查找特定值。

时间:2012-11-27 02:33:17

标签: matlab octave

您好我需要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%的增量为(1,3)= 12,在增量20%后出现最低值是(1,6)= 8.经过的时间是3。
  3. 然后代码从步骤2中找到的最低值中找到最高值。在这种情况下,第9列的值为26.它还记录经过的时间。
  4. 最后,代码测量从第一个delta值到找到的最高值所经过的时间。在这种情况下,从(1,3)到(1,9)的时间是6.
  5. 所以输出看起来像这样:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

在此值之后找到最小值

[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)上设置i循环,但必须有更好的方法来对代码进行矢量化。

整个事情设置为使用for - 循环

% 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