與Mat的R代表類似的函數我正在尋找一個rep與Matlab中R函數類似的函數。例如,rep我可以執行以下操作:> rep(c(1,2,3),times=3)[1] 1 2 3 1 2 3 1 2 3> rep(c(1,2,3),each=3)[1] 1 1 1 2 2 2 3 3 3>在matlab中有repmat函數,它完成了第一部分>> repmat([1,2,3],1,3)ans =
1 2 3 1 2 3 1 2 3但不是第二部分(或者至少我不明白該怎么做)。有什么建議?
3 回答

慕勒3428872
TA貢獻1848條經驗 獲得超6個贊
您可以通過首先定義一個函數,如下所示,在R中重現rep函數的語法:
function [result]=rep(array, count)matrix = repmat(array, count,1);result = matrix(:);
然后,您可以通過使用行或列向量調用來重現所需的行為:
>> rep([1 2 3],3)ans = 1 1 1 2 2 2 3 3 3>> rep([1 2 3]',3) ans = 1 2 3 1 2 3 1 2 3
注意我在第二次調用中使用了transpose(')運算符將輸入數組作為列向量(3x1矩陣)傳遞。
我在筆記本電腦上對此進行了基準測試,并且對于重復100次的100,000個元素的基本陣列,它比使用上面的ceil選項快2到8倍,具體取決于您是否需要第一個或第二個排列。

浮云間
TA貢獻1829條經驗 獲得超4個贊
好問題+1。完成此任務的簡潔單線方法是通過Kronecker張量積,例如:
A = [1 2 3];N = 3;B = kron(A, ones(1, N));
然后:
B = 1 1 1 2 2 2 3 3 3
更新: @Dan提供了一個非常簡潔的解決方案,看起來比我的kron
方法更有效,所以在離開頁面前檢查答案:-)
更新: @bcumming還提供了一個很好的解決方案,當輸入向量很大時,它應該非常好地擴展。

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
如果像我一樣你不知道Kronecker張量產品是什么,你可能會對這個更直觀(實際上我認為更快)的解決方案感興趣:
c(ceil((1:length(c)*n)/n));
所以我在這里用矢量索引來復制矩陣。例如,使用上面的兩個案例,我們可以做到:
c = 1:3;c([1 1 1 2 2 2 3 3 3]) %for each c([1 2 3 1 2 3 1 2 3]) %for times
所以問題是如何在沒有你要求的功能的情況下制作矢量[1 2 3 1 2 3 1 2 3]。所以我用我們需要的元素數量(即1:9)然后除以3并向上舍入(即ceil((1:9)/3)
在命令行中嘗試)。
一些基準測試(我知道這些東西應該在循環中,所以這可能不是那么準確):
c = 1:3; n = 3;tic; k = kron(c, ones(1, n)); toc; % 0.000208 seconds.tic; a = c(ceil((1:length(c)*n)/n)); toc; % 0.000025 seconds.clear;c = 1:1000000; n = 3;tic; k = kron(c, ones(1, n)); toc; % 0.143747 seconds.tic; a = c(ceil((1:length(c)*n)/n)); toc; % 0.090956 seconds.clear;c = 1:10000; n = 1000;tic; k = kron(c, ones(1, n)); toc; % 0.583336 seconds.tic; a = c(ceil((1:length(c)*n)/n)); toc; % 0.237878 seconds.
- 3 回答
- 0 關注
- 670 瀏覽
添加回答
舉報
0/150
提交
取消