0

1列で5448行の行列があり、それぞれに値があります。実際には、これらの5448値は12タップに分割されます(タップあたり454値)。タップ境界に最も近い値の最も近い10%にインデックスを付けたい(タップの10%は45.4値なので、45個の値としましょう)。最初のタップでは、最後の10%のみが必要であり、最後のタップ(タップ12)では、最初の10%のみが必要です。1つおきにタップ(2-11)すると、最初の10%と最後の10%が必要になります。つまり、基本的に、各タップの最初の45個の値と最後の45個の値です。

現在、次のように値セグメントを抽出しています。

A1 = interpolate((817/2+.5):(908/2),:);
B1 = interpolate((909/2+.5):(1000/2),:);

この例には、タップ1の最後の10%の値と、タップ2の最初の10%の値が含まれています。プルするセグメントが少ない場合は問題ありませんが、約40,000の値になる行列がある場合は、この方法を使用します。少しばかげています。

4

1 に答える 1

3

これらの値を取得するための関数を作成して、ばかげた間違いを避けるようにします (また、タップ サイズまたはパーセンテージを変更した場合に簡単にするため)。

function [A, B] = GetTapBoundaries( arr, tapNum, tapSize )
    sliceSize = floor(tapSize * 0.1);
    boundaryIdx = (tapNum-1) * tapSize;  % last element in previous tap

    leftIdx = boundaryIdx - sliceSize + 1;
    rightIdx = boundaryIdx + sliceSize;

    if leftIdx >= 1 && boundaryIdx <= size(arr,1)
        A = arr( leftIdx:boundaryIdx, : );
    else
        A = [];
    end

    if boundaryIdx >= 0 && rightIdx <= size(arr, 1)
        B = arr( boundaryIdx+1:rightIdx, : );
    else
        B = [];
    end
end

次のように呼び出します。

tapSize = 454;
[A1, B1] = GetTapBoundaries( interpolated, 1, tapSize );
[A2, B2] = GetTapBoundaries( interpolated, 2, tapSize );
% etc ...
[A12, B12] = GetTapBoundaries( interpolated, 12, tapSize );

または、セル配列を使用できます。

tapSize = 454;
numTaps = floor( size(interpolated,1) / tapSize );
A = cell(numTaps,1);
B = cell(numTaps,1);
for tap = 1:numTaps
    [Ax, Bx] = GetTapBoundaries( interpolated, tap, tapSize );
    A(tap) = Ax;
    B(tap) = Bx;
end

構文エラーまたは論理エラーについてお詫び申し上げます... MATLAB でチェックせずに、このコードをブラウザーに突っ込みました。

于 2012-08-01T22:20:01.497 に答える