我正在做一个爱好项目,我有一个矩阵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。
非常感谢任何帮助!
答案 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)
以下是执行以下操作的另一个选项:
0
开头和结尾。0
系列。
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