在矩阵中的特定数字之间的轮廓值

时间:2016-09-13 09:52:41

标签: matlab

我正在做一个爱好项目,我有一个矩阵1x1000,数字如0 30 50 70 100 50 60 0 50 40 30 20 50 0等。

现在我想描述0之间的所有值,所以在上面的例子中,它将导致[30 50 70 100 50 60]和[50 40 30 20 50]。我试过range,但这可能不是正确的方法。

此外,我想设置一个条件,它只能在零之间存在一定数量的数字时进行分析,例如5。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

我认为在这种情况下,简单循环是最佳解决方案:

V = randi(10,500000,1)-1 %random vector generation
V = [0;V;0]; %need to start and end with 0
pos = find(V==0); %find the 0's position
for i = 1:length(pos)-1
    M{i} = V(pos(i)+1:pos(i+1)-1);
end

ind = cellfun(@length,M);
M(ind<5) = [];

答案 1 :(得分:1)

使用find查找非零数字。然后找到不同段的开始和结束索引。

% Example input
A = [0 30 50 70 100 50 60 0 50 40 30 20 50 0];

% Find start and end point of segments
validIdx = find(A(:)~=0);
idxEdge = diff(validIdx) > 1;
fromTo = [ validIdx([true ; idxEdge])  validIdx([idxEdge ; true]) ];

% Create segments
C = arrayfun(@(from,to) A(from:to), fromTo(:,1), fromTo(:,2),'UniformOutput',false);

最后的arrayfun可以替换为for循环,以加快评估速度

C = cell(length(A),1);
for k = 1:size(fromTo,2)
    C{k} = A(fromTo(k,1):fromTo(k,2));
end
C(cellfun('isempty',C)) = [];

,并提供:

celldisp(C)
C{1} =
    30    50    70   100    50    60 
C{2} =
    50    40    30    20    50

查找某个最小长度的段(例如,所有段大于5)

% Get the length of each segment
nNumbers = cellfun(@length, C);
lengthThreshold = 5;
% Remove shorter segments
C = C(nNumbers > lengthThreshold);

,并提供:

celldisp(C)
C{1} =
    30    50    70   100    50    60

答案 2 :(得分:1)

以下是执行以下操作的另一个选项:

  1. 不假设向量以0开头和结尾。
  2. 可以处理向量中的0系列。
  3. 消除输出中的空单元格。
  4. 预分配输出,并仅在高于预定义大小的段
  5. 上循环

    minsize = 5; % minimum size for segment
    V = (randi(10,50,1)-1)*10; % random vector generation
    zero_pos = find([0;V(:);0]==0); % all 0's position
    d = diff(zero_pos); % count how large is each segment
    % Ignore 0 and <minsize sized segments:
    seg_start = zero_pos([true;d>max(minsize,1)])-1;
    segments = cell(numel(seg_start)-1,1); % preallocate segments array
    for k = 1:numel(seg_start)-1
        segments{k,1} = nonzeros(V(seg_start(k)+1:seg_start(k+1)-1)).';
    end
    

    和典型输入(V)和输出(segments):

    V =
      Columns 1 through 12
        70     0    60    40    40    10    10    10    20    90    70    20
      Columns 13 through 24
        90    60    10     0    20    60    10    10     0    40    70    90
      Columns 25 through 36
         0    30    80     0    30    10    40    60    30    60    50    30
      Columns 37 through 48
        40    10    10    80    80     0    10    20    40    50    20    50
      Columns 49 through 50
        90    80
    
    segments{1} =
        70
    segments{2} =
      Columns 1 through 12
        60    40    40    10    10    10    20    90    70    20    90    60
      Column 13
        10
    segments{3} =
        20    60    10    10
    segments{4} =
        40    70    90
    segments{5} =
        30    80
    segments{6} =
      Columns 1 through 12
        30    10    40    60    30    60    50    30    40    10    10    80
      Column 13
        80
    segments{7} =
        10    20    40    50    20    50    90    80