用于创建重复元素向量的 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 和一般编程的新手。我正在考虑如何使用 while
或 if
循环来构造它,但无法生成更高效的代码。)
【问题讨论】:
我会复制向量[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))
如果你喜欢mod
ulo 操作,可以
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 R2015a 是 repelem
:
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