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 で発生した最低値までの経過時間を測定します。 (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 にアクセスできません。ただし、開始するためのいくつかの手順を次に示します。テストケースの回答を再確認して、目的の結果が得られることを確認してください。

行 vector があるとしますxiあなたの場合、データマトリックスの th 行と言います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)]

これは最初の行で機能します。3 行目では、値があることを確認する必要cIがあります。cIが空の場合は、 を使用してNaN(1,6)ください。

要素数を超えた場合cI+1、同様のエラー チェックが行われます。cI+minI+1これは、探している変更の発生が遅すぎる場合に発生します。

forまず、各行 ( ) に対してループを設定できますが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 に答える