在Haskell中,如果我想得到一个只包含数字5的10元素列表,我可以这样做:
take 10 $ repeat 5
Run Code Online (Sandbox Code Playgroud)
输出:
[5,5,5,5,5,5,5,5,5,5]
Run Code Online (Sandbox Code Playgroud)
在Matlab中有这样的东西吗?
dka*_*itz 65
It is easy to assign repeated values to an array:
x(1:10) = 5;
Run Code Online (Sandbox Code Playgroud)
If you want to generate the array of elements inline in a statement try something like this:
ones(1,10) * 5
Run Code Online (Sandbox Code Playgroud)
or with repmat
repmat(5, 1, 10)
Run Code Online (Sandbox Code Playgroud)
Mat*_*ter 22
one方法比使用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.
Run Code Online (Sandbox Code Playgroud)
并且,在我看来,使代码更具可读性.
给定预定义的m-by-n矩阵大小和目标值val,在您的示例中:
m = 1;
n = 10;
val = 5;
Run Code Online (Sandbox Code Playgroud)
目前7我想到了不同的方法:
1)使用repmat功能 (0.094066秒)
A = repmat(val,m,n)
Run Code Online (Sandbox Code Playgroud)
2)使用赋值对未定义矩阵进行索引 (0.091561秒)
A(1:m,1:n) = val
Run Code Online (Sandbox Code Playgroud)
3)使用ones函数索引目标值 (0.151357秒)
A = val(ones(m,n))
Run Code Online (Sandbox Code Playgroud)
4)完全分配的默认初始化 (0.104292秒)
A = zeros(m,n);
A(:) = val
Run Code Online (Sandbox Code Playgroud)
5)使用乘法的1函数 (0.069601秒)
A = ones(m,n) * val
Run Code Online (Sandbox Code Playgroud)
6)使用零加功能 (0.057883秒)
A = zeros(m,n) + val
Run Code Online (Sandbox Code Playgroud)
7)使用repelem功能 (0.168396秒)
A = repelem(val,m,n)
Run Code Online (Sandbox Code Playgroud)
每一种方法的描述之后,在括号之间的,其对应的基准下进行Matlab 2017a,并用100000迭代.获胜者就是6th方法,这并不让我感到惊讶.
解释很简单:分配通常会产生零填充的内存槽...因此除了添加val到矩阵的每个成员之外不会执行任何其他操作,并且最重要的是,输入参数清理非常短.
对于该5th方法来说也是如此,这是第二快的方法,因为尽管输入参数清理过程基本相同,但在内存方面正在执行三个操作而不是两个:
1val| 归档时间: |
|
| 查看次数: |
122312 次 |
| 最近记录: |