我有一个像这样的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时发生(在上面的代码中称为“会话”)。这是与我的特定矩阵的组织有关的要求。
我如何实现我的最终目标?
答案 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