【问题标题】:Group index vector from vector with nummer of elements in group来自具有组中元素数的向量的组索引向量
【发布时间】:2014-08-07 08:44:23
【问题描述】:

我想从包含每个组中元素数量的向量创建一个包含每个元素的组标识符的向量。

例子:

E = [2 3 4]'

我正在寻找如下向量:

I = [1 1 2 2 2 3 3 3 3]

我找到了一个涉及循环的解决方案:

I = [];
for e=1:size(E,1),
    I = [I ; e*ones(E(e),1)];
end

但这似乎不是很优雅。欢迎任何改进建议。

【问题讨论】:

标签: matlab run-length-encoding


【解决方案1】:

您正在寻找run length decoding
试试这个

n = sum( E ); %// tot number of elelments
I = zeros( 1, n ); % //preallocate!
I(cumsum( [ 1 E(1:end-1) ] ) ) = 1;
I = cumsum( I )

请参阅ideone 的运行示例。

【讨论】:

  • 如果我使用E = [2 3 4] 运行您的代码,它不会返回预期的结果。猜猜……出错了。
  • @TheMinion 请在 ideone 上查看我的编辑和运行示例。
  • @Shai 我用更大的向量做了一些测试,你的代码是迄今为止最快的!谢谢!
  • @TiredHornet 在我的测试中结果是关闭的。你应该对数据进行双重检查。我的E=[4, 4, 10, ...] 产生I= [1 1 1 2 2 2 2 2 2 2 2 2 3 3 ...]。因此构造的E=[3, 9, 7,...] 是错误的。如上所述,我的测试功能是:E=ceil(rand(1,1000)*10);
  • @Shai 是的,如果您的代码现在工作得很好,并且它仍然比所有其他解决方案快得多。干得好:D 和 +1
【解决方案2】:

试试这个:

X = arrayfun(@(x) [1 zeros(1,x-1)], E, 'uni',0)
Y = cumsum( [X{:}] )

【讨论】:

  • 我喜欢您的解决方案,其中包含单元格,然后在矢量化 X 上进行 cumsum。非常整洁!
【解决方案3】:

我遇到了类似的问题。我认为,如果不使用 for 循环,它并不像人们想象的那么简单。

这是我的解决方案:

I = cell2mat(arrayfun(@(x) repmat(x,E(x),1),1:numel(E),'UniformOutput',false)') 

一些解释: x 是 E 的索引。 数组函数从 1“迭代”到 numel(E)。 repmat 复制索引 x E(x) 次。 数组函数的输出是一个带有向量 [11]、[222] 和 [3333] 的 1x3 元胞数组。由于向量大小不同,我必须将 Uniformoutput 设置为 false。但我想连接这些嵌套向量,所以我使用 cell2mat(...)

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2019-05-06
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多