在Haskell,如果我想獲得該只包含5號10元素的列表,我可以做這樣的事情:填充MATLAB陣列相同的價值觀
take 10 $ repeat 5
輸出:
[5,5,5,5,5,5,5,5,5,5]
在MATLAB中有這樣的東西嗎?
在Haskell,如果我想獲得該只包含5號10元素的列表,我可以做這樣的事情:填充MATLAB陣列相同的價值觀
take 10 $ repeat 5
輸出:
[5,5,5,5,5,5,5,5,5,5]
在MATLAB中有這樣的東西嗎?
這是很容易重複的值分配給數組:
x(1:10) = 5;
如果你想生成元素的數組內聯在聲明中嘗試這樣:
ones(1,10) * 5
或
repmat(5, 1, 10)
請參閱repmat的文檔。
B = repmat(5,1,10)
的那些方法比使用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.
而且,在我看來,爲使更可讀的代碼。
正如在其他的答案中提到,您可以使用:
>> 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.
鑑於預定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
http://www.mathworks.com/help/techdoc/ref/repmat.html – zellus 2011-02-07 06:59:23
非常感謝。如果您將此作爲答案提交,我會將其標記爲正確。 – Tyler 2011-02-07 07:01:28
可能相關的問題: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