2011-02-07 38 views
39

Haskell,如果我想获得该只包含5号10元素的列表,我可以做这样的事情:填充MATLAB阵列相同的价值观

take 10 $ repeat 5 

输出:

[5,5,5,5,5,5,5,5,5,5] 

在MATLAB中有这样的东西吗?

+1

http://www.mathworks.com/help/techdoc/ref/repmat.html – zellus 2011-02-07 06:59:23

+0

非常感谢。如果您将此作为答案提交,我会将其标记为正确。 – Tyler 2011-02-07 07:01:28

+0

可能相关的问题:http://stackoverflow.com/questions/1947889/element-wise-array-replication-in-matlab,http://stackoverflow.com/questions/1975772/matlab-array-manipulation,http:/ /stackoverflow.com/questions/2382319/matlab-element-wise-array-replication-according-to-a-count – Amro 2011-02-08 01:34:29

回答

63

这是很容易重复的值分配给数组:

x(1:10) = 5; 

如果你想生成元素的数组内联在声明中尝试这样:

ones(1,10) * 5 

repmat(5, 1, 10) 
22

的那些方法比使用repmat快得多:

>> tic; for i = 1:1e6, x=5*ones(10,1); end; toc 
Elapsed time is 3.426347 seconds. 
>> tic; for i = 1:1e6, y=repmat(5,10,1); end; toc 
Elapsed time is 20.603680 seconds. 

而且,在我看来,为使更可读的代码。

0

正如在其他的答案中提到,您可以使用:

>> tic; x=5*ones(10,1); toc 
Elapsed time is 0.000415 seconds. 

更快的方法是:

>> tic; x=5; x=x(ones(10,1)); toc 
Elapsed time is 0.000257 seconds. 
3

鉴于预定m-by-n矩阵大小和目标值val,在你的榜样:

m = 1; 
n = 10; 
val = 5; 

目前有7不同ap浮现在我的脑海proaches:


1)使用repmat功能(0.094066秒)

A = repmat(val,m,n) 

2)与分配未定义的矩阵索引(0.091561秒)

A(1:m,1:n) = val 

3)关于使用ones函数(0.151357秒目标值索引)

A = val(ones(m,n)) 

4)默认值初始化全分配(0。104292秒)

A = zeros(m,n); 
A(:) = val 

5)使用ones函数乘法(0.069601秒)

A = ones(m,n) * val 

6)使用zeros函数并加入(0.057883秒)

A = zeros(m,n) + val 

7)使用repelem功能(0.168396秒)

A = repelem(val,m,n) 

每一种方法的描述之后,在括号之间的时,其相应的基准下Matlab 2017a并用100000迭代进行。获胜者是6th的方法,这并不令我感到惊讶。

解释很简单:分配通常会产生零填充的内存槽......因此除了向矩阵的每个成员添加val之外,不会执行其他操作,并且最重要的是,输入参数清理很短。

同样不能说是为5th方法,这是第二个最快的一个,因为尽管输入参数消毒过程是基本相同,对记忆侧正在执行,而不是两个三个操作:

  • 初始分配
  • 每个元素转变成1
  • 乘法由val