在Matlab矩阵中出现非连续预定义值的顺序

时间:2013-12-15 22:26:14

标签: 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   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(“值”中指定的值之一)出现在第一行中,因此它变为1(即“第一次”列中出现“值”中的一个值第9列中的7“),然后是其他值,第9列不会改变(仍为0)。然后出现0,所以在第9列中添加等级2(在“值”中指定的一个值的第二个出现)。在连续行中出现0次,在连续出现的情况下,第9列的值保持不变等级(例如2)。依此类推。

我已经根据a previous question更改了以下代码:

ALLphases(:,9) = 0; %CREATE COLUMN 9 WITH VALUE 0 everywhere

session = 2; 
values = [0 1 2]; 

for ii = 1:numel(values)
    first(ii) = find(ALLphases(ALLphases(:,8)==session,7)==values(ii),1);
end
[~, use_values] = sort(first);
[~, use_values] = sort(use_values);
for ii = 1:numel(values)
    ALLphases(ALLphases(:,8)==session & ALLphases(:,7)==values(ii), 9) = use_values(ii);
end

这几乎就在那里,但我需要它逐步计算所有值,即使它们之前出现过。

请注意,第9列中基于第7列的值的更改仅在第8列等于2时发生(在上面的代码中称为“会话”)。这是与我的特定矩阵的组织有关的要求。

我如何实现我的最终目标?

1 个答案:

答案 0 :(得分:1)

我认为这可以做你想要的,没有循环:只是一些索引和diff。 (不知道我是否正确处理第8行):

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