2012-04-16 10 views
0

こんにちは私はMatLabで行列を作成する方法を見つけようとしており、運動の最大値と最小値を30秒間にわたって繰り返しています。例えばMatLabのデータセットの最大点と最小点

、私はデータセットを持っていた場合:

data = [1 3 5 7 9 6 4 2 3 6 8 10 7 6 4 2 1] 

私の希望な結果は次のようになります。

output = [1 9 2 10 1] 

機能だけで絶えず変化する波形のピーク値をプロットします。

次のように私が試したコードは次のとおりです。

size = length(data); %Get the length of the dataset 
x = 1;     %Set a counter value 
maxplot = 0;   %Default, a maximum value has not yet been plotted 

for x = 1:size-1 
    a1 = data(1,x);  %Get two adjacent samples of the dataset 
    a2 = data(1,x+1); 

    v = 1; %Set the initial column for the max points matrix 

    while maxplot == 0 
     if a1 > a2 
      max(v,1) = a1; 
      v = v + 1; 
      maxplot = 1; 
     end 
    end 

    if a1 < a2 
     maxplot = 0;  
    end 
end 

事前に返信誰でも感謝、

ジャレド。

+0

あなただけのこれを行い機能を書いてみましたか?それは難しく見えません。 – trutheality

+0

私は試しましたが、私はMatLabを使いこなすのが初めてです。私はMatLabが「Busy」として詰まっていたので、間違いなく無限ループを作ったと思います。 – jazibobs

+0

あなたが試したことを投稿して誰かがあなたを助けることができます... – trutheality

答えて

2

あなたはこのようなものを使用することができます

function Y = findpeaks(X) 
    deltas = diff(X); 
    signs = sign(deltas); 
    Y = [true, (signs(1:(end-1)) + signs(2:end)) == 0, true]; 

findpeaksは、その入力X配列と同じ長さの論理配列を返します。マークされた値を抽出するには、論理配列でインデックスを作成します。例えば

data = [1 3 5 7 9 6 4 2 3 6 8 10 7 6 4 2 1]; 
peaks = data(findpeaks(data)) 

万一出力:

peaks = 
    1 9 2 10 1 

この関数は、入力配列の繰り返し値に対処するための特別な何もしません。私はそれを読者のための練習として残す。

+0

ピーク時にフラットな部分があると失敗するようです... 8 10 10 7 ...)。 – trutheality

+0

@trutheality:True。私はメモを追加します。 –

+0

ありがとうございますこれは絶対に完璧です。私は見つからなかった "findpeaks"にこのような簡単なオプションがあるのか​​どうか分からなかった。 – jazibobs

2

このバージョンでは、ジョンのほどきれいではありませんが、平坦部がある場合には、ピークを失うことはありません。

function peaks = findpeaks(data) 
% Finds the peaks in the dataset 

size = length(data); %Get the length of the dataset 
x = 1;     %Set a counter value 
peaks = data(1,1);  %Always include first point 

if size == 1 %Check for sanity 
    return 
end 

lastdirection = 0;  %Direction of change 

directions = sign(diff(data)); %Directions of change 
           % between neighboring elements 

while x < size 
    % Detect change in direction: 
    if abs(directions(x) - lastdirection) >= 2 
     peaks = [peaks, data(1,x)]; 
     lastdirection = directions(x); 
    else 
     % This is here so that if lastdirection was 0 it would get 
     % updated 
     lastdirection = sign(lastdirection + directions(x)); 
    end 
    x = x+1; 
end 

peaks = [peaks, data(1,size)]; 
end