当前位置: 首页 > 知识库问答 >
问题:

组索引向量来自组中元素数量较多的向量

葛鸿熙
2023-03-14

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

例子:

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

但这看起来不太优雅。欢迎提出任何改进建议。

共有3个答案

杜炫明
2023-03-14

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

以下是我的解决方案:

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

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

宇文学博
2023-03-14

试试这个:

X = arrayfun(@(x) [1 zeros(1,x-1)], E, 'uni',0)
Y = cumsum( [X{:}] )
秦承安
2023-03-14

您正在寻找运行长度解码<试试这个

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

请参阅ideone的运行示例。

 类似资料:
  • 这似乎微不足道,但也许我对向量的理解并不是它应该是的。我在这段代码上得到[java.lang.ArrayIndexOutOfBoundsException:Array index out of range:1]。错误发生在第3行。既然look是基于向量的大小,那么数组怎么会越界呢? 方法“getChangeSets()”返回一个列表。该列表最初是作为向量创建的。

  • 这应该很容易,但我一直在撞我的头。 我有数字向量 我有一个数值向量v2。v2始终是v1的子集。 我想从v1中删除v2中的所有元素,但每个v2元素只删除一个(而且完全是一个)v1元素。 所需输出 如果我希望将保留在v1之外。使用很容易。 如果我希望将与v1保持一致。此外,也能起到作用。 如果我希望将与v1保持一致。现在返回。不是我想要的。 当答案输入时,我很可能会用头撞我的键盘,但现在我还没有得到最

  • 我试图将元组向量转换为向量[人],但上面的代码会导致强制转换异常,即使存在隐式的元组-人转换函数? 线程“main”java中出现异常。lang.ClassCastException:scala。Tuple2无法转换为示例。例如,测试$人。测试$$anonfun$2$$anonfun$应用$1。在scala应用(测试scala:19)。收集迭代器$类。scala上的foreach(迭代器。scal

  • 在我的JavaScript小程序中,我必须检查a和b输入值:如果它们是新的一对,则这一对将作为1D向量添加到小程序的历史记录中。 因此,我制作了一个历史2D数组,其中存储了所有新的对。程序循环数组,将新对与历史数组的每一行进行比较。然而,我有一个问题:当比较的结果应该是真的(即,当I==1时),我得到了一个假结果。 我读了这一页:https://www.w3schools.com/js/js_ar

  • 在swift中,我想比较同一数组中的两个不同索引。现在,我的代码是这样的: 由此,我得到一个错误: 我该怎么解决这个问题呢?

  • 问题: 在OpenCl 1.2中,没有内置函数,如 我尝试过的: 所以我使用下面的代码(展开循环的预取内部部分) 将整数数组(int4 arr)的所有元素求和(减少)为一个长变量,与串行代码相比,其速度仅为0。如果它能启用SSE或AVX,速度会快得多。 还尝试了: 使用纯整数累加器将求和运算速度提高3倍,但整数溢出,因此我只能使用长变量。然后我尝试使用long4和long2变量作为 但它失败并锁定