2011-02-07 39 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