如何初始化具有特定值的矩阵的所有条目?

Tyl*_*ler 40 arrays matlab

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)

并且,在我看来,使代码更具可读性.


zel*_*lus 5

请参阅文档中的repmat.

B = repmat(5,1,10)
Run Code Online (Sandbox Code Playgroud)


Tom*_*zzo 5

给定预定义的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方法来说也是如此,这是第二快的方法,因为尽管输入参数清理过程基本相同,但在内存方面正在执行三个操作而不是两个:

  • 初始分配
  • 将每个元素转化为 1
  • 乘以 val