Как я знаю на языке C, чтобы умножить массив на скаляр, вы должны перебирать каждый элемент, используя цикл for. И, как я знаю, исходный код для программной среды R написан в основном на C. И оттуда, когда у меня есть большая матрица в R, такая как mat = matrix(5, nrow = 1100, ncol = 1100)
, а затем умножить ее на константу и измерить время этой операции, просто вот так:
t_start = Sys.time()
mat = mat *5
print(Sys.time()-t_start)
Выход:
Time difference of 0.005984068 secs
Но, делая то же самое с помощью циклов for, это занимает слишком много времени:
t_start = Sys.time()
for(i in 1:1100)
{
for(j in 1:1100)
{
mat[i,j] = mat[i,j] * 5
}
}
print(Sys.time()-t_start)
выход:
Time difference of 0.1437349 secs
Второй способ примерно в 24 раза медленнее, и теперь я предполагаю, что за кулисами первый способ также был сделан с помощью циклов for, если так, то почему разница во времени слишком большая?!
Мне интересно, есть ли лучший способ применить операцию ко всему блоку памяти в C без итерации по каждому элементу с использованием циклов.
Я хотел бы получить некоторые ответы с точки зрения языка C, поскольку в настоящее время я работаю с C. И эти фрагменты R-кода были просто для демонстрации двух разных способов сделать это, которые R предоставляет, а C - нет.