我有一个像这样的 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 列中应该计算的值是 values = [0 1 2](顺序并不重要:[1 2 0] 应该给出相同的结果)。
在示例最终矩阵中,值 0(“值”中指定的值之一)出现在第一行,因此它变为 1(即“第一次出现在“值”中的值之一列中7") 在第 9 列中,然后是其他值,并且第 9 列没有更改(仍然为 0)。然后出现 0,因此在第 9 列中添加排名 2(第 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
这几乎就在那里,但我需要它来逐步计算所有值,即使它们之前出现过。
请注意,如果第 8 列等于 2(在上面的代码中称为“ session ”),第 9 列中的值会根据第 7 列发生变化。这是与我的特定矩阵的组织相关的要求。
我怎样才能实现我的最终目标?
请您参考如下方法:
我认为这会做你想做的,没有循环:只是一些索引和 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