Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/76: Рейтинг темы: голосов - 76, средняя оценка - 4.80
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2

Транспонировать один массив в другой

03.01.2013, 22:08. Показов 15080. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть большой массив данных (от 5000 до 800000 строк на 100-200 столбцов)
Сделал транспонирование через For

Visual Basic
1
2
3
4
5
For i = 0 to n
For j = 0 to m
   mas2(i,j) = mas1(j,i)
Next j
Next i
Но это очень долгая процедура.

Может есть стандартное средство языка для такого дела?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.01.2013, 22:08
Ответы с готовыми решениями:

Дан массив из 10 элементов.Перенести в один другой массив четные числа.Затем перенести в еще один другой масси
Дан массив из 10 элементов.Перенести в один другой массив четные числа.Затем перенести в еще один другой массив нечетные числа.Помогите с...

У меня есть массив t[n,m]. Мне нужно последний столбец записать в другой массив и транспонировать его
Здравствуйте! У меня есть массив t. Мне нужно последний столбец записать в другой массив и транспонировать его, т.е. сделать так, чтобы...

Перенести в один другой массив четные числа.Затем перенести в еще один другой массив нечетные числа.
Дан массив из 10 элементов.Перенести в один другой массив четные числа.Затем перенести в еще один другой массив нечетные числа.Помогите с...

27
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
05.01.2013, 12:17  [ТС]
Студворк — интернет-сервис помощи студентам
вообщем я не с числами работаю... у мнея всё variant... и просто немеряно проверок всяких делается))) посмотрел старый код - намудрил я там с циклами несколько))) Но всё одно долго он выполняется... непростительно долго.... сейчас буду подвешивать эти свои проверки.. А там текст + даты + числа + вычисляемые поля. Вообщем больная голова, а не задача)))

Добавлено через 1 час 16 минут
примерно соотношение 40 % текст 40 % числа 20 % даты

Добавлено через 3 минуты
с датами идут вычисления с числами тоже текст проверяется на сопоставимость по парам
вот и вылезло время дохренищща))) да... кстати ноут - первое поколение неламповых)))
на самом деле среднестатистистический из ушедших год назад из продажи
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
05.01.2013, 12:49
До всё равно необоснованно долго.
Может не все операции делаются в памяти, а грузятся на лист?
Так же печать в Дебаггер промежуточных результатов очень тормозит процесс
( я часто так делаю при отладке, но при работе - обязательно убрать из больших циклов)
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
05.01.2013, 14:04  [ТС]
дебуги все убраны изначально... хотя скорость проверить не получится))) последняя версия тремя - пятью минутами обходится

Добавлено через 1 минуту
просто перелопатил код и убрал всю динамическую составляющую и некоторые форы...
вот еще вопрос .... как может влиять на скорость динамическая часть массива... когда на каждый новый элемент массива я его переписываю в режиме пресерва...
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
05.01.2013, 15:59
Если массив большой, то preserve будет тормозить, т.к. массив не дополняется, а полностью переписывается.
Даже глазом становится заметно - как-то делал синтетический опыт.
Поэтому Алексей в начале и советовал сразу задать массив по максимуму, затем можно выгрузить только реально нужное. Будет правда занята лишняя память, зато избавитесь от потерь на лишних действиях.

Добавлено через 12 минут
Вот например такой нехитрый код - после полумиллиона глазом видны тормоза.
Если нагрузить объёмом - то думаю будет заметно раньше.

Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub tt()
    Dim i&
    ReDim arr(1 To 1)
    For i = 1 To 1000000
        ReDim Preserve arr(1 To i)
        arr(i) = i
        If i Mod 10000 = 0 Then Application.StatusBar = i
    Next
    Application.StatusBar = False
End Sub
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,769
Записей в блоге: 14
05.01.2013, 17:27
Выполнять ЭТО:

Visual Basic
1
ReDim Preserve arr(1 To i)
в цикле???
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
05.01.2013, 17:57
"когда на каждый новый элемент массива я его переписываю в режиме пресерва" - разве это не в цикле? Как тогда появляются новые элементы?
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
06.01.2013, 02:16
Написал функцию для транспонирования массива типа Variant путем переписывания кусков памяти.
Функция работает В 3 РАЗА БЫСТРЕЕ, чем метод Application.Transpose, но имеет существенное ограничение.
Если в массиве содержатся числа (включая Decimal и Currency), данные типа Boolean, Date - все хорошо.
Но если элементы массива содержат строки, то транспонированный массив содержит достоверные значения в этих элементах только пока существует исходный массив! Если стереть исходный массив, в транспонированном массиве могут оказаться случайные данные, и обращение к ним, скорее всего, приведет к краху программы. Это связяно с тем, что в переменной типа Variant\String содержится ссылка на строку, а сама строка - в другой области памяти. При стирании переменной типа Variant\String память, занимаемая строкой, освобождается для других процессов, и может быть изменена в любой момент. А элемент транспонированного таким способом массива продолжает хранить ссылку на эту область памяти.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Dst As Any, Src As Any, ByVal Length As Long)
 
Function TransVar(v()) As Variant()
'возвращает транспонированный массив v, ИМЕЕТ СУЩЕСТВЕННЫЕ ОГРАНИЧЕНИЯ!
Const L16& = 16
Dim lb1&, lb2&, ub1&, ub2&, i&, j&, k& ', z()
Dim endK&, stepK&, z0&
lb1 = LBound(v)
ub1 = UBound(v)
lb2 = LBound(v, 2)
ub2 = UBound(v, 2)
ReDim z(lb2 To ub2, lb1 To ub1)
 
i = VarPtr(v(lb1, lb2))             'адрес первого эл-та массива v
z0 = VarPtr(z(lb2, lb1))            'адрес первого эл-та массива z
endK = VarPtr(z(lb2, ub1)) - z0     'размер строки массива z
stepK = VarPtr(z(lb2, lb1 + 1)) - z0 'шаг по строке массива z
For j = z0 To VarPtr(z(ub2, lb1)) Step L16 'VarPtr(z(lb2, lb1 + 1)) - z0
    For k = j To j + endK Step stepK
        CopyMem ByVal k, ByVal i, L16
        i = i + L16
    Next
Next
TransVar = z
End Function
тестовые процедуры
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Sub test()
Dim q(), w()
Dim i&, j&, k&, t!
 
'проверка работоспособности функции
ReDim q(-3 To -1, 5 To 8)
For i = LBound(q) To UBound(q)
    For j = LBound(q, 2) To UBound(q, 2)
        q(i, j) = k
        k = k + 1
    Next
Next
Cells.Clear
Arr2Sheet q, [A1]
w = TransVar(q)
Arr2Sheet w, [F1]
Arr2Sheet TransVar(w), [A5]
 
'сравнение скорости с методом Application.Transpose
 
ReDim q(1 To 60, 1 To 91) 'макс. размер для Excel 2000
For i = LBound(q) To UBound(q)
    For j = LBound(q, 2) To UBound(q, 2)
        q(i, j) = Rnd
    Next
Next
t = Timer
For i = 1 To 1000
    w = TransVar(q)
Next
Debug.Print "TransVar", Timer - t
t = Timer
For i = 1 To 1000
    w = Application.Transpose(q)
Next
Debug.Print "Transpose", Timer - t
 
End Sub
 
Sub Arr2Sheet(arr(), rng As Range)
rng.Resize(UBound(arr) - LBound(arr) + 1, UBound(arr, 2) - LBound(arr, 2) + 1) = arr
End Sub
Результаты замеров времени:
Code
1
2
TransVar       3,245117 
Transpose      10,19482
Может, напишу транспонирование массива "на месте", там не будет такого ограничения.
2
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
06.01.2013, 17:40  [ТС]
пресерв в цикле был! это точно1 он и тормозил все дела. Как только от него избавился сразу время показало - что с увеличением строк в массиве затраты времни не увеличиваются
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.01.2013, 17:40

Как один массив скопировать в другой однотипный массив?
Всем здравствуйте. Есть два однородных массива. Второй не длиннее первого. Второй массив получается после преобразования первого (в...

Преобразовать один массив в другой
Привет Всем! Тут такая проблемка случилась: программист я одним словом – никакой, но нужно написать программу. О ней сейчас я...

Один массив записать в другой
Здравствуйте! Возникла следующая проблема: как создать копию многомерного массива с другим именем? Заранее благодарю!

Как поместить один массив в другой?
Дана последовательность чисел, расположить ее ненулевые элементы по возрастанию. Написал программу, создал новый массив, записал в него...

Как переписать один массив в другой
<?php /* Make a function that organizes a list of dogs and their owners and returns dog owner names and their dog names. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru