【发布时间】:2017-09-15 14:35:13
【问题描述】:
假设一个array a=[1,3,8,10,11,15,24]和一个logical array b=[1,0,0,1,1,1,0,0,0,1,1,1,1,1],如何得到[1,1,3,1,3,8,1,3,8,1,2,3,8,10],看看b中逻辑在哪里变成1,a的数组索引重置,所以它从头开始,也是相同的逻辑变为 0 a array 从头开始并继续为 1,3,8,10..etc.
【问题讨论】:
假设一个array a=[1,3,8,10,11,15,24]和一个logical array b=[1,0,0,1,1,1,0,0,0,1,1,1,1,1],如何得到[1,1,3,1,3,8,1,3,8,1,2,3,8,10],看看b中逻辑在哪里变成1,a的数组索引重置,所以它从头开始,也是相同的逻辑变为 0 a array 从头开始并继续为 1,3,8,10..etc.
【问题讨论】:
您可以使用diff 查找b 更改的位置,然后使用arrayfun 为a 生成索引:
a=[1,3,8,10,11,15,24];
b=[1,0,0,1,1,1,0,0,0,1,1,1,1,1];
idxs = find(diff(b) ~= 0) + 1; % where b changes
startidxs = [1 idxs];
endidxs = [idxs - 1,length(b)];
% indexes for a
ia = cell2mat(arrayfun(@(x,y) 1:(y-x+1),startidxs,endidxs,'UniformOutput',0));
res = a(ia);
【讨论】:
您可以使用 for 循环并跟踪 b 数组的状态(0 或 1):
a = [1,3,8,10,11,15,24];
b = [1,0,0,1,1,1,0,0,0,1,1,1,1,1];
final = []
index = 0;
state = b(1);
for i = 1:numel(b)
if b(i) ~= state
state = b(i);
index = 1;
else
index = index+1;
end
final = [final, a(index) ];
end
【讨论】: