【问题标题】:Inverse tabulate function in MATLAB [duplicate]MATLAB中的反制表函数[重复]
【发布时间】:2015-12-04 12:14:55
【问题描述】:

我有一个带有频率的数组 freq 和另一个带有值的 val

val =[1 3 5 7];    
freq=[2 3 3 2];

我想得到数组result

result=[1 1 3 3 3 5 5 5 7 7];

我尝试获取result 的方法之一是:

freq=[2 3 3 2];
val=[1 3 5 7];
result=[];
for i=1:length(val);
    result=[result repmat(val(i),1,freq(i))];
end

它可以工作,但是对于大型数组,如果我摆脱for-loop,我预计会获得一些性能提升。是否有任何内置功能?对于大型数组,您将如何计算 result

【问题讨论】:

  • 通过将result 预分配到result = zeros(1, sum(freq)) 并在循环中适当地处理索引,可以实现对循环的微小改进。

标签: performance matlab


【解决方案1】:

可以这样:

val = [1 3 5 7]
freq = [2 3 3 2]
res = repelem(val, freq)

res =

 1     1     3     3     3     5     5     5     7     7

【讨论】:

    【解决方案2】:

    对于大型向量,您可以通过预分配 result 并同时更新多个单元格来获得一些性能。

    result = zeros(sum(freq), 1);
    j = 1;
    for i=1:length(freq);
        result(j:j+freq(i)-1) = val(i);
        j = j + freq(i);
    end;
    

    【讨论】:

      猜你喜欢
      • 2017-07-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      相关资源
      最近更新 更多