Страницы: 1
RSS
Приравнивание части массива другому массиву без цикла
 
собственно на листе есть столбец чисел.

мне нужно скользящее среднее геометрическое по этим числам.
чтобы воспользоваться встроенной функцией
Код
Application.WorksheetFunction.GeoMean(arrayMy) 

я в цикле заношу в массив  arrayMy числа из столбца.

А хотелось бы как-то так:
Код
redim arrayMy(1 to iMax)
arrayMy=MyArray(i..i+iMax)

Как правильно это записать?
 
Цитата
andre_bae написал: в массив  arrayMy числа из столбца
Код
arrayMy = Range("A1:A100").Value
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
arrayMy = Range("A1:A100").Value
Спасибо.
Но так очень медленно работает, я весь столбец заношу в одномерный массив MyArray,
и вопрос в том, чтобы не лазая на лист часть этого массива заносить в arrayMy
 
Цитата
andre_bae написал:
так очень медленно работает
С чего Вы взяли?
 
Измерял время.
возможно, можно ускорить если ПРАВИЛЬНО обращаться к листу, отключая расчет формул и обновления,
наверное, можно пойти и по такому пути.
я однократно заношу в массив данные из столбца и пытаюсь работать с ним, записывая на лист лишь результат расчетов.
так есть возможность массив части другого массива приравнять не лазая на лист или это не реализовать кроме как циклом по элементно?
 
Цитата
andre_bae написал: массив части другого массива приравнять не лазая на лист или это не реализовать кроме как циклом по элементно?
Slicing an Array Without Loop
Согласие есть продукт при полном непротивлении сторон
 
andre_bae, Вы что-то путаете: вариант, предложенный Sanja в #2 - это самый быстрый способ забрать данные с листа в массив и больше к листу не обращаться, а работать уже с этим массивом.
По основному вопросу: думаю, что придётся циклом перекладывать нужные данные из одного массива в другой. Это быстро.
 
Если разовая операция, зачем массив?
Код
Application.GeoMean(Range("A1:A100"))
 
Цитата
Sanja написал:
Slicing an Array Without Loop
Thnx! я именно и пытался это сформулировать
 
Цитата
vikttur написал: Если разовая операция, зачем массив?
я эту операцию делаю для КАЖДОГО элемента исходного массива, причем размерность расчета средного геометрического тоже динамически меняется.
Цитата
Slicing an Array Without LoopThnx!
похоже, этот вариант скорости относительно выборки прямо с листа мне не добавит. Но все равно спасибо за ответ на мучивший меня вопрос!
 
Цитата
Юрий М написал: вариант, предложенный  Sanja  в #2 - это самый быстрый способ забрать данные с листа в массив и больше к листу не обращаться,
я именно этим способом и забираю с листа в исходный массив все данные. а потом скольжу по нему выборкой для расчета среднего геометрического.
похоже, что придется именно что выбирать с листа выборку а не заносить сразу весь массив в память
 
Цитата
andre_bae написал:
похоже, этот вариант скорости относительно выборки прямо с листа мне не добавит.
Да кто же Вам предлагает работать с листом? Работайте с массивом, как показано по ссылке.
 
Цитата
andre_bae написал:
похоже, что придется именно что выбирать с листа выборку а не заносить сразу весь массив в память
А вот это будет как раз медленно. Забирайте в массив всё, а уже из него выбирайте нужное.
 
Цитата
Юрий М написал:
Да кто же Вам предлагает работать с листом?
так в№2 именно для расчета среднего выборка выбирается в массив. И повторять это действие придется для каждого из значений в столбце.
именно что медленно. потому я и хотел все забрать в массив, а из него выборку подмассива для расчета среднего делать.
надо будет померить время но подозреваю, что вариант с .index не будет ощутимо быстрее чем занесение в цикле по-элементно в выборку элементов из массива
 
Цитата
andre_bae написал:
так в№2 именно для расчета среднего выборка выбирается в массив. И повторять это действие придется для каждого из значений в столбце.
Вы опять путаете: действие из #2 нужно выполнить 1 (ОДИН!) раз - заберёте в массив весь диапазон. А дальше работайте именно с этим массивом - перекладывайте из получившего массива во второй, который затем одним махом можно будет выгрузить на лист.
 
Цитата
Юрий М написал:
А дальше работайте именно с этим массивом - перекладывайте из получившего массива во второй
так я как раз и спрашивал о том, как ПЕРЕКЛАДЫВАТЬ? как загрузить все в массив однократно я знаю.
 
Вместо того, чтобы показать пример, уже 16 сообщений в пустоту...
 
Цитата
andre_bae написал:
как ПЕРЕКЛАДЫВАТЬ?
Я же не знаю, по какому условию Вам необходимо переложить... Вот такой  вариант переложит во второй массив каждое второе значение из первого.
Код
Sub qqq()
Dim i As Long, x As Long, ArrIn(), ArrOut
    ArrIn = Range("A1:A1000").Value
    ReDim ArrOut(1 To UBound(ArrIn), 1 To 1)
    For i = 1 To UBound(ArrIn) Step 2
        x = x + 1
        ArrOut(x, 1) = ArrIn(i, 1)
    Next
    Range("F1").Resize(x, 1).Value = ArrOut
End Sub
 
Цитата
vikttur написал:  ...показать пример...
так ответ уже получен в №6. И за него я поблагодарил.

Вопрос закрыт.
Страницы: 1
Наверх