如何将矩阵索引为段

时间:2012-08-01 21:58:55

标签: matlab matrix indexing segment

我有一个1列的矩阵,5448行,每行都有值。实际上,这5448个值被分成12个抽头(每个抽头454个值)。我想索引最接近分接边界的最近10%的值(10%的分接头是45.4值,所以假设45个值)。对于第一次点击,我只需要最后10%,而对于最后一次点击(点按12),我只需要前10%。每隔一个水龙头(2-11)我需要10%的开头和10%的开头。基本上每个水龙头的前45个值和最后45个值。

目前我正在提取像这样的值段:

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

这个例子包括tap 1的最后10%值和tap 2的前10%值。如果我只有几个段来拉这个就没关系,但是当我的矩阵达到大约40,000个值时,这种方法有点荒谬。

1 个答案:

答案 0 :(得分: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中检查它。