MATLAB 乐趣无穷

5
我希望能生成一个如下的数组:

var arr = [ ];

a = [1 1 2 2 3 3 4 4 5 5 6 6 ....]
%% or something like this 
a = [1 1 1 .. ktimes 2 2 2 ... ktimes .....]

在MATLAB中是否能够通过一行代码完成此操作?我相信有多种答案。请不要使用循环。

这种行为相当于R中的rep函数,它是一个标准函数。不幸的是,MATLAB缺乏这个内置功能。这是一个非常有用的函数。这里的所有方法(kronbsxfunreshapefloor/ceil)也可以在重复的答案中找到。我并不是贬低这里所做的努力。这是一个非常有趣的讨论,但为了规范起见,我已将上述帖子标记为重复。 - rayryeng
1
@rayryeng 这真是个好发现! - Divakar
2
@roni - 绝对不行。就留在这里吧。你从一些最好的MATLAB人物那里得到了一些很棒的答案。尽管我之前已经看过它们,但我仍然享受着这个讨论和阅读答案。我给所有答案和你的帖子点了赞 :) 然而,我将其标记为重复,仅仅是为了规范化的目的。这也将允许其他读者看到这个功能集成到其他编程语言和平台中,而不是MATLAB(咕哝)...并且我们应该完全抱怨一下,以便有朝一日它可以成为本地函数。 - rayryeng
1
@rayryeng 感谢您的友善回复! - roni
1
@rayryeng 我知道有一个重复的问题...(实际上,有几个)。我只是太懒去搜索它,而回答这个问题太有趣了! - Luis Mendo
显示剩余4条评论
2个回答

8
使用reshaperepmat函数。
reshape(repmat([1:6],k,1),1,[])

使用bsxfun函数 -

reshape(bsxfun(@plus,[1:6],zeros(k,1)),1,[])

应广大需求,关于floor-

floor(1:1/k:6+(k-1)/k)

1
@roni repmatreshape是非常基本的Matlab函数。它们并不复杂! - Luis Mendo
1
@roni 也添加了 floor 版本。 - Divakar
1
@Divakar 我喜欢你的“其实很无聊”哈哈,那让我笑了,谢谢。 - Benoit_11
2
@Benoit_11 哈哈,是啊,然后使用 round/floor/ceil 的需求变得有点具有挑战性了 :) - Divakar
1
@roni 使用 ceilfloor 版本,向下或向上移动 0.5,然后使用 round 完成基于 floor/ceil/round 的方法集合! - Divakar
显示剩余3条评论

8

n = 6;k = 2;。以下是一些替代方法:

kron(1:n,ones(1,k))

或者

ceil(1/k:1/k:n)

或者
double(uint64(1:n*k)/k)

3
你是认真的吗?前两个只是输入数据!请查看编辑。 - Luis Mendo
2
我本来会直接使用reshape/repmat的方法,但是ceil方法绝对是一个不错的技巧。(double(uint(...))方法只是伪装成一样的东西,你让类型转换处理ceil操作在幕后) - Hoki
2
@Hoki 我同意这两点。repmat 是正确的方法。 - Luis Mendo
3
哈哈,有点好笑。你用了 ceil,所以我只好用 floor :) - Divakar
2
@Divakar 是的 :-) 我喜欢你的“应众要求”,非常有趣的表达方式! - Luis Mendo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接