我有一个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个值时,这种方法有点荒谬。
答案 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中检查它。