我熟悉Matlab,但我的直觉中仍然存在矢量化方法的问题,所以我想知道是否有人可以证明他们如何处理这个问题。
我有一个数组,例如A = [1 1 2 2 1 3 3 3 4 3 4 4 5]
。
我想返回一个数组B
,这样每个元素都是A
最近'的索引。元素与前一个元素的值不同。
因此,对于我们的数组A
,B
将等于[x x 2 2 4 5 5 5 8 9 10 10 12]
,其中x可以是您喜欢的任何一致值,因为之前的索引没有满足这些特征
我知道如何将其编码为for
- 循环,并且我打赌for循环可能更快,但是任何人都可以将其矢量化为比for循环更快吗?
这是我的for
- 循环:
prev=0;
B=zeros(length(A),1);
for i=2:length(A)
if A(i-1)~=A(i)
prev=i-1;
end
B(i)=prev;
end
答案 0 :(得分:2)
查找值更改的条目的索引:
ind = find(diff(A) ~= 0);
因此,B
中应显示的值为:
val = [0 ind];
构建diff
的{{1}}:填写应出现在正确位置的值之间的差异:
B
现在使用Bd = zeros(size(B))';
Bd(ind + 1) = diff(val);
构建cumsum
:
B
不确定这是否会导致加速。