Matlab矩阵中非连续预定义值的出现顺序
我有一个像这样的9列矩阵:Matlab矩阵中非连续预定义值的出现顺序,matlab,matrix,Matlab,Matrix,我有一个像这样的9列矩阵: X X X X X X 0 2 0 X X X X X X 6 2 0 X X X X X X 6 2 0 X X X X X X 7 2 0 X X X X X X 8 2 0 X X X X X X 8 2 0 X X X X X X 0 2
X X X X X X 0 2 0
X X X X X X 6 2 0
X X X X X X 6 2 0
X X X X X X 7 2 0
X X X X X X 8 2 0
X X X X X X 8 2 0
X X X X X X 0 2 0
X X X X X X 0 2 0
X X X X X X 0 2 0
X X X X X X 6 2 0
X X X X X X 8 2 0
X X X X X X 7 2 0
X X X X X X 8 2 0
X X X X X X 8 2 0
X X X X X X 1 2 0
X X X X X X 1 2 0
X X X X X X 2 2 0
X X X X X X 2 2 0
X X X X X X 0 2 0
X X X X X X 1 2 0
X X X X X X 2 2 0
X X X X X X 2 2 0
X X X X X X 2 2 0
X X X X X X 2 2 0
X X X X X X 2 2 0
X X X X X X 2 2 0
X X X X X X 2 2 0
X X X X X X 8 2 0
X X X X X X 0 2 0
X X X X X X 1 2 0
我使用X作为本例中不相关的列的值。
第9列最初只包含零。
我想要实现的是更改第9列中的值,对应于预定义值的出现顺序(而所有其他值保持为0)
在脚本中,我应该能够指定一些值(在下面的结果矩阵中:0、1和2),这些值应该在列中每次出现(非连续)时逐步计数。结果应该是:
X X X X X X 0 2 1
X X X X X X 6 2 0
X X X X X X 6 2 0
X X X X X X 7 2 0
X X X X X X 8 2 0
X X X X X X 8 2 0
X X X X X X 0 2 2
X X X X X X 0 2 2
X X X X X X 0 2 2
X X X X X X 6 2 0
X X X X X X 8 2 0
X X X X X X 7 2 0
X X X X X X 8 2 0
X X X X X X 8 2 0
X X X X X X 1 2 3
X X X X X X 1 2 3
X X X X X X 2 2 4
X X X X X X 2 2 4
X X X X X X 0 2 5
X X X X X X 1 2 6
X X X X X X 2 2 7
X X X X X X 2 2 7
X X X X X X 2 2 7
X X X X X X 2 2 7
X X X X X X 2 2 7
X X X X X X 2 2 7
X X X X X X 2 2 7
X X X X X X 8 2 0
X X X X X X 0 2 8
X X X X X X 1 2 9
在本例中,第7列中应计数的值为值=[0 1 2](顺序不重要:[1 2 0]应给出相同的结果)
在示例最终矩阵中,0的值(在“值”中指定的值之一)出现在第一行中,因此在第9列中变为1(即“值”中的值之一首次出现在第7列中),随后出现其他值,第9列不变(仍然为0)。然后出现0,因此在第9列中添加秩2(在“值”中指定的一个值的第二次出现)。0在连续行中出现三次,如果连续出现,则第9列的值保持相同的秩(例如2)。以此类推,如示例所示
我已根据以下代码进行了更改:
这差不多就到了,但是我需要它来逐步计算所有的值,即使它们以前出现过
请注意,如果第8列等于2(在上面的代码中称为“会话”),则第9列中的值会发生基于第7列的更改。这是与我的特定矩阵的组织相关的要求
我怎样才能达到我的最终目标 我想这是你想要的,没有循环:只是一些索引和
diff
。(但不确定我是否正确处理了第8行):
示例结果:
>> matrix
matrix =
0 0 0 0 0 0 0 2 1
0 0 0 0 0 0 3 2 0
0 0 0 0 0 0 4 2 0
0 0 0 0 0 0 1 2 2
0 0 0 0 0 0 1 2 2
0 0 0 0 0 0 0 2 3
0 0 0 0 0 0 2 2 4
0 0 0 0 0 0 6 2 0
0 0 0 0 0 0 1 2 5
0 0 0 0 0 0 2 2 6
+1对于公式化良好的问题,似乎缺少的是,如果
values
中的值与先前的相等值相邻,则它在第9列中保持相同的排名(并且不会变为0)。对于我所需要的,你的第9专栏将是[1 0 0 2 3 4 0 5 6]很棒!最后一件事是,如果在同一个矩阵上对第8列使用不同的值运行两次脚本,它将用零覆盖先前的结果。我需要在同一个矩阵上为第八列的不同值运行相同的脚本。。。如果第9列的值不需要更改(即,如果它们不在值的同一行上),是否有办法防止替换它们?@Albz请参阅更新的答案。现在它不会在第9列中写入任何零,只有非零值可以完美地工作。。。如果我现在想使用您的脚本,但在使用它之后,还要围绕这些已定义的值更改值7或8和6(例如,检测模式)(),该怎么办?
matrix = [zeros(6,10); 0 3 4 1 1 0 2 6 1 2; 2*ones(1,10)].'; %'// example data
values = [0 1 2]; %// example data
ind = ismember(matrix(:,7), values) & matrix(:,8)==2; %// detect values
ind2 = ind & logical(diff([inf; matrix(:,7)])) ; %// detect start of runs
[ind3, ~, fill] = find(cumsum(ind2).*ind); %// fill at ind, increasing as per ind2
matrix(ind3,9) = fill;
>> matrix
matrix =
0 0 0 0 0 0 0 2 1
0 0 0 0 0 0 3 2 0
0 0 0 0 0 0 4 2 0
0 0 0 0 0 0 1 2 2
0 0 0 0 0 0 1 2 2
0 0 0 0 0 0 0 2 3
0 0 0 0 0 0 2 2 4
0 0 0 0 0 0 6 2 0
0 0 0 0 0 0 1 2 5
0 0 0 0 0 0 2 2 6