用于创建重复元素向量的 for/while/if 程序

Posted

技术标签:

【中文标题】用于创建重复元素向量的 for/while/if 程序【英文标题】:A for/while/if program to create a vector of repeated elements 【发布时间】:2017-02-14 14:14:01 【问题描述】:

我的任务是编写一个程序来创建一个向量,它的前 10 个元素为 10,元素 11-20 为 20,元素 21-30 为 30,元素 31-40 为 40,& 元素41-50 为 50。

我就是这样做的。

v=zeros(1,50);
for i = 1:10 
    v(i)=10;
end
for i =11:20
    v(i)=20;
end
for i = 21:30
    v(i)=30;
end
for i = 31:40
    v(i)=40;
end
for i = 41:50
    v(i)=50
end

我怎样才能更有效地写这个? (我是 matlab 和一般编程的新手。我正在考虑如何使用 whileif 循环来构造它,但无法生成更高效的代码。)

【问题讨论】:

我会复制向量 [10:10:50] 以创建该向量的 10 行,然后将其重塑为行向量:reshape(repmat((10:10:50), 10, 1), 1, []) 非常代数,而且很可能比 Suever 的解决方案效率低,但仍然...v = reshape(10*ones(10,1)*(1:5),1,[]); 另一种选择类似于v=floor(1:0.1:5.9)*10;,它的效率略高,但可读性较差。 只是一个帮助您理解 cmets 的注释:如果您想使用 Matlab 更高效,请避免循环,并且更喜欢矢量化。 @F88 请考虑接受一个答案。谢谢! 【参考方案1】:

你可以使用cumsum:

v = zeros(1,50);
v(1:10:end) = 10;
v = cumsum(v)

使用kron

v = kron(10:10:50,ones(1,10))

如果你喜欢modulo 操作,可以

v = reshape( mod(reshape((0:49)',[5 10]),5)'+1, 1, [] )*10

我觉得比@MrAzzaman提出的sort+mod效率高一点。

【讨论】:

【参考方案2】:

cmets 和 Shai 的解决方案都非常好。这主要是为了跳出框框思考。一个更奇特的解决方案是使用bsxfun,然后将生成的矩阵展开成一个向量:

v = bsxfun(@times, 10:10:50, ones(10,1));
v = v(:).';

【讨论】:

我一直支持 bsxfun。顺便说一句,你应该有 10 个而不是 5 个 @Shai Aha,我错过了。谢谢你。我会纠正的。【参考方案3】:

由于我们采用多种方式来做这件事,所以有些不同(尽管可能效率不高):

v=sort(mod(10:10:500,50))+10;

也是一种类似于 rayryeng 的回答的方法,虽然我认为效率更高一些(避免调用bsxfun):

v = 10:10:50;
v = v(ones(10,1),:);
v = v(:)';

【讨论】:

在小输入上使用bsxfun 确实效率较低。随着输入的大小变大,您会发现它工作得更好。 sort 的方式很别扭,但是第二种方案很优雅! @Shai 是的,sort 方法从来没有被认真对待,它更像是一个学术练习,看看我能想到多少解决问题的方法:)【参考方案4】:

此任务的专用函数自 Matlab R2015arepelem:

x = repelem(10:10:50,10)

还有另一种选择:

s = 10; m = 50;
x = meshgrid(s:s:m,ones(s,1))
x = x(:)

【讨论】:

以上是关于用于创建重复元素向量的 for/while/if 程序的主要内容,如果未能解决你的问题,请参考以下文章

Swift 运算符循环流程控制 for-in, while, if-else, switch-case, guard-else

R从n个元素的字符向量中生成大小为m的所有可能组合[重复]

删除向量的元素

从具有重复元素的向量生成所有唯一组合

对向量的元素进行排序,其中每个元素都是一对[重复]

R语言rep函数重复向量或者列表元素实战