2013-12-16 83 views
2

指望他们我有这样一个矩阵:匹配模式和在Matlab

8 
8 
8 
2 
2 
2 
6 
6 
7 
7 
7 
1 
1 
6 
6 
6 
6 
8 
8 
0 
6 
8 
8 
1 
6 
6 

有固定模式,总是重复。我想检测它们。它们根据这些规则重复:与7,接着用多条线路

线可以是(0,1或2),接着是6

线8,随后用多条线路,其能是(0,1或2),后面是6对于检测到的单个模式中的每个值(独立于它们组成的行的数量),在第二列中写入多个等级,从1开始,每当检测到第一列中的新模式时递增。这将是结果:

8 1 
    8 1 
    8 1 
    2 1 
    2 1 
    2 1 
    6 1 
    6 1 
    7 2 
    7 2 
    7 2 
    1 2 
    1 2 
    6 2 
    6 2 
    6 2 
    6 2 
    8 3 
    8 3 
    0 3 
    6 3 
    8 4 
    8 4 
    1 4 
    6 4 
    6 4 

第2个编码在每行中的第1图案(系列的值= 1路,意味着该线路上有数据相关的图案1),第二图案(值2)和等等... 我该怎么做?

+1

这是不是真的清楚你想怎么填充矩阵。你能否展示一个更小的例子,但是有一个完整的信息?前6列似乎也不重要,所以你可能会把这些排除在这个例子之外。 –

+0

我简化了这个问题。我希望现在更清楚...... – Albz

回答

1

这里的,只有使用“关闭标签”的矩阵分成几部分的解决方案:

function b = replaceValues(a) 
    closingTag = 6; 
    % Find all closing tag positions 
    clTagPos = a(:, 1) == closingTag; 
    % Keep only the "last" tags and add matrix start/end positions 
    splitPoints = [0; find(diff(clTagPos) == -1); length(a)]; 
    % Split matrix into cell array 
    acell = mat2cell(a, diff(splitPoints)); 
    % Replace the second column of each part with the corresponding non-zero value 
    bcell = cellfun(@(c)[c(:, 1) ones(length(c), 1)*c(find(c(:, 2), 1), 2)], acell, 'UniformOutput', 0); 
    % Convert back to matrix 
    b = cell2mat(bcell); 
end 

例的输入 - 输出在Matlab:

a = 

8  0 
8  0 
8  0 
2  1 
2  1 
2  1 
6  0 
6  0 
7  0 
7  0 
7  0 
1  2 
1  2 
6  0 
6  0 
6  0 
6  0 
8  0 
8  0 
0  3 
6  0 
8  0 
8  0 
1  4 
6  0 
6  0 

>> b = replaceValues(a) 

b = 

8  1 
8  1 
8  1 
2  1 
2  1 
2  1 
6  1 
6  1 
7  2 
7  2 
7  2 
1  2 
1  2 
6  2 
6  2 
6  2 
6  2 
8  3 
8  3 
0  3 
6  3 
8  4 
8  4 
1  4 
6  4 
6  4 
+1

谢谢,它不工作。我得到这个错误:试图访问c(:,2);索引越界,因为size(c)= [209000,1]。 – Albz

+0

它适用于您上面发布的示例,对不对?这和导致错误的数据集之间有一些主要区别吗? – 3lectrologos

+0

原始矩阵由9列组成,例1中的列1对应于7列,而例2中的列2对应于列9,但我不确定这是否是问题 – Albz