MATLAB中的任何内置函数都可以像R中的"ave"一样工作



我正在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矩阵,其中Nx的长度(:

    xid = sum(triu(x==x.'));
    
  • 效率稍高(计算一个中间U×N矩阵,其中Ux的唯一元素数(:

    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
    

最新更新