我正在MATLAB
中寻找一个内建函数,它可以与R
中的ave
以类似的方式工作。
以下是R
:的示例
set.seed(0)
x <- sample(c("A", "B"), 10, replace = TRUE)
xid <- ave(seq_along(x), x, FUN = seq_along)
它给出
> x
[1] "B" "A" "B" "A" "A" "B" "A" "A" "A" "B"
> xid
[1] 1 1 2 2 3 3 4 5 6 4
换句话说,我不知道MATLAB
中的哪个函数允许我按x
分组,并按组分配序列ID,这样我就可以得到像xid
这样的数组。我知道splitgroup
可能接近目标,但它并没有给我想要的输出,因为它产生了汇总的结果。
问题要求将x
中的每个条目替换为迄今为止发生的次数。
我不知道有什么内置函数可以做到这一点。以下是一些方法。让
x = ['B' 'A' 'B' 'A' 'A' 'B' 'A' 'A' 'A' 'B']; % example data. Row vector
短代码,但内存效率低(计算中间
N
×N
矩阵,其中N
是x
的长度(:xid = sum(triu(x==x.'));
效率稍高(计算一个中间
U
×N
矩阵,其中U
是x
的唯一元素数(:t = x==unique(x).'; xid = nonzeros(t.*cumsum(t,2)).';
镗孔带循环的高效代码:xid = NaN(size(x)); % preallocate for u = unique(x) t = x==u; xid(t) = 1:sum(t); end