Учитывая предопределенный 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