0
distances = sqrt((x - max(x)).^2 + (y - max(y)).^2);
    [peaks, iPeaks] = findpeaks(distances);%to find out where the curve turns around
          for i = 1 : length(iPeaks)-1
                    iPeaks1 = iPeaks(i);
                    iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
                     %skip small noise peaks
                   if length(iPeaks1:iPeaks2)>=5 
                      xx=x(iPeaks1:iPeaks2)
                       yy=y(iPeaks1:iPeaks2)
                   end
                end

こんにちは

ベクトルxxとyyを作成する必要があります。問題は、各サイクルで過去のxxとyyが削除されることですが、反対のことが必要です。過去の情報を残し、サイクルごとに成長してほしい。私に何ができる?また、xxとyyを事前に割り当てる必要があることもわかっています。

私はどんな助けにも感謝します。どうもありがとうございます。

**これは可能な解決策です。ここでの問題は、事前に割り当てる必要があることです。しかし、私がそれを行うと、xxとyyはゼロを保持し、「ゼロを内部に入れて」成長し続けます。これは間違っています。

distances = sqrt((x - max(x)).^2 + (y - max(y)).^2);
[peaks, iPeaks] = findpeaks(distances);%to find out where the curve turns around
xx=[];
yy=[];
for i = 1 : length(iPeaks)-1
        iPeaks1 = iPeaks(i);
        iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
         %skip small noise peaks
       if length(iPeaks1:iPeaks2)>=5 
          xx = [xx; x(iPeaks1:iPeaks2)];%''concatenate''(connect)
          yy = [yy; y(iPeaks1:iPeaks2)];
       end
end
4

3 に答える 3

1

ベクトルの成長は、連結を使用して簡単に実行できます。

x = [1, 2, 3];
y = [4, 5, 6, 7];
z = [x, y]; %# z will be [1, 2, 3, 4, 5, 6, 7]

あなたの場合、あなたは

%# Start with an empty vector.
xx = [];
for i = 1 : length(iPeaksNoise)-1
    [...]
    xx = [xx, x(iPeaks1:iPeaks2)];
end

の形状に依存しiPeaksNoiseないように(つまり、行ベクトルか列ベクトルかに関係なく)、次のように使用できます。

for [...]
    t = x(iPeaks1:iPeaks2);
    xx = [xx; t(:)];
end

事前割り当てとは、最終出力の長さを持つゼロのベクトルを作成することを意味します。あなたはこのようなことをするでしょう

final_size = what_so_ever;
xx = zeros(final_size, 1);
start_index = 1;
for [...]
    t = x(iPeaks1:iPeaks2);
    xx(start_index : start_index + length(t) - 1) = t;
    start_index = start_index + length(t);
end

ただし、あなたの場合、ループ内でどのくらいの頻度で満たさxxれるかわからないため、事前に最終的なサイズがわからないという追加の問題があります。length(iPeaks1:iPeaks2)>=5

編集:

が事前に割り当てられているコードは、次のxxようになります。

distances = sqrt((x - max(x)).^2 + (y - max(y)).^2);
[peaks, iPeaks] = findpeaks(distances);

%# Compute the distance between two peaks.
peakDistance = diff(iPeaks);
%# Filter peaks which are of length 5 or less.
peakMask = peakDistance > 5;
finalSize = sum(peakDistance(peakMask));
%# Copy the values in a new vector.
xx = zeros(1, finalSize);
idx = 1;
for count = 1 : length(peakDistance)
  if peakMask(count)
    pD = peakDistance(count);
    xx(idx : idx + pD - 1) = x(iPeaks(count) : iPeaks(count) + pD - 1);
    idx = idx + pD;
  end
end
于 2012-10-04T11:27:38.327 に答える
0

どこにデータを配置するかを明示的に指定する必要がありxxますyy。あなたのコードからあなたがそれを望む場所を理解するのは難しいです、しかしそれはこれらの行で何かを見るはずです

start = some_index_in_xx;
v = x(iPeaks1:iPeaks2);
xx(start:start+numel(v)-1)=v;

そして、同じですyystart自分で計算する必要があります。

一方、新しい部分xyベクトル部分をとの末尾にxx追加する場合yyは、これを行います

xx = [xx x(iPeaks1:iPeaks2)];
yy = [yy y(iPeaks1:iPeaks2)];

ループの前に初期化する必要がxxあります。yy

xx = [];
yy = [];
于 2012-10-04T11:19:46.000 に答える
0

ここでは、各反復でxxとyyに追加する要素の数が毎回同じではないと想定しています。次に、スペースを事前に割り当てたい場合は、合計する金額を確認する必要があります。そのため、コードは余分なループでより複雑になります。1つのバージョンは

x=(5*sin(0:(pi/100):2*pi)+rand(201,1)'-0.5)';
y=(5*cos(0:(pi/100):2*pi)+rand(201,1)'-0.5)';
%%
distances = sqrt((x - max(x)).^2 + (y - max(y)).^2);
[peaks, iPeaks] = findpeaks(distances);%to find out where the curve turns around

counterx = 0;
for i = 1 : length(iPeaks)-1
    iPeaks1 = iPeaks(i);
    iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
    %skip small noise peaks
    if length(iPeaks1:iPeaks2)>=5
        counterx =counterx+ iPeaks2-iPeaks1+1;
    end
end
xx=zeros(counterx,1);
yy=xx;
counterx=0;
clc
for i = 1 : length(iPeaks)-1
    iPeaks1 = iPeaks(i);
    iPeaks2 = iPeaks(i+1)-1;%analyse of consecutive pair of peaks
    %skip small noise peaks
    if length(iPeaks1:iPeaks2)>=5
        %         xx = [xx; x(iPeaks1:iPeaks2)];%''concatenate''(connect)
        %         yy = [yy; y(iPeaks1:iPeaks2)];
        counterx=counterx+1;
        xx(counterx:counterx+iPeaks2-iPeaks1) = x(iPeaks1:iPeaks2);
        yy(counterx:counterx+iPeaks2-iPeaks1) = y(iPeaks1:iPeaks2);
        counterx=counterx+iPeaks2-iPeaks1;
    end
end
disp([xx yy]')

しかし、これはmatlabです。あなたはそれをすべてする必要はないはずです。論理フラグを使用して同じことを行い、1回の急降下ですべての小さなピークを削除するコードを次に示します。

% find all the iPeaks that are 5 apart from the next one
peakdiffs = find((iPeaks(2:end)-iPeaks(1:end-1)-1)>=5);
% make a logical array quickly with same size as x
removeflag = x<=inf;
for i=1:numel(peakdiffs)
    % for each peak that is bigger than your threshold, those parts of the
    % logical array will be made false.
    removeflag(iPeaks(peakdiffs(i)):iPeaks(peakdiffs(i)+1)-1)=false;
end
%remove all indices in x,y that are still false in removeflag and store in xx
%and yy resp
xx= x; xx(removeflag)=[];
yy= x; yy(removeflag)=[];
disp([xx yy]')
于 2012-10-04T17:31:48.057 に答える