Как инициализировать все записи матрицы с определенным значением? - PullRequest
40 голосов
/ 07 февраля 2011

В Haskell , если бы я хотел получить список из 10 элементов, который содержал только число 5, я мог бы сделать что-то вроде этого:

take 10 $ repeat 5

Выход:

[5,5,5,5,5,5,5,5,5,5]

Есть ли что-нибудь подобное в Matlab?

Ответы [ 5 ]

65 голосов
/ 07 февраля 2011

Для массива легко назначить повторяющиеся значения:

x(1:10) = 5;

Если вы хотите сгенерировать массив элементов, встроенных в оператор, попробуйте что-то вроде этого:

ones(1,10) * 5

или с repmat

repmat(5, 1, 10)
22 голосов
/ 07 февраля 2011

Метод одни гораздо быстрее, чем с помощью 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. 

И, на мой взгляд, делает код более читабельным.

5 голосов
/ 10 февраля 2018

Учитывая предопределенный m-by-n размер матрицы и целевое значение val, в вашем примере:

m = 1;
n = 10;
val = 5;

в настоящее время на мой взгляд приходят 7 различных подходов:


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) Использование нулей функция с добавлением (0,057883 секунды)

A = zeros(m,n) + val

7) Использование функции repelem (0,168396 секунд)

A = repelem(val,m,n)

После описания каждого подхода, в скобках, соответствующий тест выполняется при Matlab 2017a и с 100000 итерациями.Победителем является 6th подход, и это меня не удивляет.

Объяснение простое: выделение обычно приводит к заполнению нулями слотов памяти ... поэтому никакие другие операции не выполняются, кроме добавленияval каждому члену матрицы, и, кроме того, очистка входных аргументов очень коротка.

Этого нельзя сказать о подходе 5th, который является вторым по быстродействию, посколькунесмотря на то, что процесс очистки входных аргументов в основном одинаков, на стороне памяти вместо двух выполняются три операции:

  • первоначальное распределение
  • преобразование каждого элемента в 1
  • умножение на val
5 голосов
/ 07 февраля 2011

См. repmat в документации.

B = repmat(5,1,10)
0 голосов
/ 04 декабря 2017

Как уже упоминалось в других ответах, вы можете использовать:

>> 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...