Sibbs Gambling
Sibbs Gambling

Reputation: 20345

Elegant way of creating an array full of one number in MATLAB?

I know that to get 10 0's, one can do

A = zeros(10, 1);

To get 10 1's, one can do

A = ones(10, 1);

What about any arbitrary number? Say, I want 10 3's. I have come up with a way of doing it.

A = linspace(3, 3, 10);

Is this satisfactory? Is there a more elegant way of doing this?

Upvotes: 3

Views: 251

Answers (3)

Luis Mendo
Luis Mendo

Reputation: 112659

Some alternatives:

  • Using repmat:

    A = repmat(3, [5 7]); %// 5x7 matrix filled with the value 3
    
  • Using indexing:

    A(1:m, 1:n) = x;
    

Following is a timing comparison between all proposed approaches. As you can see, @Dennis' solutions are the fastest (at least on my system).

Functions:

function y = f1(x,m,n) %// Dennis' "ones"
y = x*ones(m,n);

function y = f2(x,m,n) %// Dennis' "zeros"
y = x+zeros(m,n);

function y = f3(x,m,n) %// Luis' "repmat"
y = repmat(x,[m n]);

function y = f4(x,m,n) %// Luis' "dirty"
y(m,n) = 0;
y(:) = x;

function y = f5(x,m,n) %// Luis' "indexing"
y(1:m,1:n) = x;

function y = f6(x,m,n) %// Divakar's "matrix porod"
y = x*ones(m,1)*ones(1,n);

Benchmarking script for square arrays:

x = 3;
sizes = round(logspace(1,3.7,10)); %// max limited by computer memory
for s = 1:numel(sizes)
    n = sizes(s);
    m = sizes(s);
    time_f1(s) = timeit(@() f1(x,m,n));
    time_f2(s) = timeit(@() f2(x,m,n));
    time_f3(s) = timeit(@() f3(x,m,n));
    time_f4(s) = timeit(@() f4(x,m,n));
    time_f5(s) = timeit(@() f5(x,m,n));
    time_f6(s) = timeit(@() f6(x,m,n));
end
loglog(sizes, time_f1, 'r.-');
hold on
loglog(sizes, time_f2, 'g.:');
loglog(sizes, time_f3, 'b.-');
loglog(sizes, time_f4, 'm.-');
loglog(sizes, time_f5, 'c.:');
loglog(sizes, time_f6, 'k.:');
xlabel('Array size')
ylabel('Time')
legend('ones', 'zeros', 'repmat', 'dirty', 'indexing', 'matrix prod')

For column arrays: just change the following lines:

sizes = round(logspace(1,3.7,10)).^2; %// max limited by computer memory
n = 1;
m = sizes(s);

For row arrays:

sizes = round(logspace(1,3.7,10)).^2; %// max limited by computer memory
n = sizes(s);
m = 1;

Results for a dual-core CPU, 2-GB RAM, Windows Vista, Matlab R2010b:

  1. Square arrays;
  2. Column arrays;
  3. Row arrays.

enter image description here

enter image description here

enter image description here

Upvotes: 12

Divakar
Divakar

Reputation: 221514

As an alternative, a matrix multiplication (which is supposed to be pretty fast on MATLAB) based method could be also be suggested for 2D or multidimensional array assignment work.

Thus, assuming m as rows, n as columns and x as the value to be assigned for all elements, the code would be -

y = x*ones(m,1)*ones(1,n);

Upvotes: 1

Dennis Jaheruddin
Dennis Jaheruddin

Reputation: 21563

There are two basic ways to do this:

A = ones(10,1)*3
B = zeros(10,1)+3

The first one is most commonly used in examples, yet if I am not mistaken, the second one performs slightly better. All in all it is just a matter of taste.

Of course, if you have an existing matrix, there is another simple way:

C = zeros(10,1)
C(:) = 3;

And for completeness, the repmat solution as suggested by @Luis is also fine.

Upvotes: 7

Related Questions