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

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

03.01.2013, 22:08. Показов 14859. Ответов 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
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,724
Записей в блоге: 14
03.01.2013, 22:20
Нет такого средства. Если хочешь, чтобы работало быстрее, опиши i и j как long.
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
03.01.2013, 22:26
Почему требуется транспонирование?
Массив можно изначально создать правильной ориентации.
В Excel есть метод Application.Transpose (функция листа ТРАНСП), но он имеет существенные ограничения по количеству элементов при работе с массивами VBA (AFAIR в Excel 2007 - 8192 элемента, 2010 - ?).
Однако, если аргументом является диапазон листа, а не массив, то ограничений нет, например
Visual Basic
1
2
Dim v()
v = Application.Transpose(Cells(1, 1).Resize(5000, 100))
2
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
03.01.2013, 22:47  [ТС]
суть в определении строк и столбцов на листе excel и в массиве.

когда я помещаю из массива данные на лист - пользуюсь командой

Visual Basic
1
Range(cells(1,1),Cells(rasm2,rasm1)).Value = massiv
Почему rasm2 стоит первым?
У листа "на рост диапазона" актуальными являются строки, а у динамического массива - последняя размерность rasm2
Но в Cells строки указываются первыми.
Вообщем мне нужно чтоб динамическая размерность соответствовала строкам.
для этого массив нужно транспонировать... или как-то по другому определитья с динамической размерностью и строками...
При количестве строк массива 23000 транспонирование одного столбца занимает 2-4 минуты. У меня - до 140 столбцов в массиве. Тупой метод - ждать. А хочется, чтоб душа пела)))

Добавлено через 2 минуты
совсем позабыл отметить! массив не читается с листа. он формируется в оперативке. двумерный динамический.
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
03.01.2013, 23:09
Цитата Сообщение от AndreA SN Посмотреть сообщение
массив не читается с листа. он формируется в оперативке. двумерный динамический.
Еще раз: формируйте его сразу в такой ориентации, чтобы его можно было выложить на лист. Размер задайте максимально возможный и даже с запасом, скажем 1 млн строк х 150 столбцов, чтобы не приходилось делать Redim Preserve.
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
03.01.2013, 23:30
до 800000 строк на 100-200 столбцов
А в допустимый размер влезешь?
Не понял как накладываются ограничения в зависимости от доступной памяти, но у меня максимальный размер виден на калькуляторе (250364*200 = 50072800)
Миниатюры
Транспонировать один массив в другой  
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
03.01.2013, 23:40
И причём это размер на два массива.
Максимально, что мог проверить:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub QWERT()
Dim i
Dim j
Dim mas1(100, 250364)
Dim mas2(250364, 100)
Dim t
t = Time
Randomize
For i = 0 To 250364
    For j = 0 To 100
     mas1(j, i) = Int(90 * Rnd + 10)
       mas2(i, j) = mas1(j, i)
    Next j
Next i
MsgBox Format(Time - t, "hh:nn:ss")
End Sub
Месага 5-6 с
Казанский,
Visual Basic
1
скажем 1 млн строк х 150 столбцов
У меня такой номер не проходит!?
2
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
04.01.2013, 01:16  [ТС]
думаю как разбить на два массива...
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
04.01.2013, 04:05
Можно поэксперементировать и определить максимальный размер.
И объявить массив как предлагал Казанский
При формировании проверять. достиг предела - выгрузить на лист, и начать заполнять снова
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
04.01.2013, 10:24  [ТС]
вот в этом направлении и двигаюсь...
решил определять в масив завершенную информационную единицу и выгружать ее...
выгрузок конечно больше получается ... по времени сегодня буду замерять затраты и сравнивать...
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
04.01.2013, 11:21
Alex77755,
  1. прокомментируйте сообщение #6;
  2. что такое "Месага"?
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
04.01.2013, 12:08
Visual Basic
1
MsgBox Format(Time - t, "hh:nn:ss")
Сообщение о затраченном времени
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
04.01.2013, 23:44  [ТС]
по поводу времени... сделал учетчик времени, который не сильно врёт)))
вообщем по времени расклад следующий.
создавал массив 22941 строк на 210 столбцов на листе

если создать в оперативке такой массив всех данных в горизонтальной проекции, а потом его транспонировать (тем способом, который я указывал в вопросе к теме) в верикальный массив (который можно легко слить на лист), то затраты времени составляют порядка 3-6 часов только на транспонирование в зависимости от машины. Это тот способ, котрым я шел до задания данного вопроса... честно говоря на установление точного времени не хватило терпения...

Сделал следующее:
По вашему совету создал сразу правильный массив, но при этом потерял динамическую составляющую процесса. Пришлось полностью перелопатить код, который обеспечивает его целостность......
Правильный (вертикальный) массив сделал под одну семантическую единицу, которая насчитывает 31 сегмент. А у меня в данном случае семантиков 4844 штуки. Но это совершенно не предел... может быть и 16 000 и 36 000
Для каждой семантической единицы заполнял массив и сливал его на лист в общий массив данных
Вроде кошмарный процесс по постоянному обращению к листу.... Но! При простом сливе массива на лист, а не поэлементном переписывании на все дела ушло от 3:46 (ноутбук) до 1:26 (стационар 64 разряда система) минут!

Осталось вопросом для меня: как это происходит в ядре excel? Скорость слива же прямо не сопоставима с поэлементным переписыванием. А для меня очень важна однозначность результата! если поэлементное переписывание массива на лист дает гарантию попадания инфы в нужную ячейку, то будет ли также безошибочным "слив" массива ?

Почему задаю этот вопрос? когда копируем с одного листа на другой диапазон столбцов в котором много пустых областей, то количество строк в итоге может различаться. Вероятно из-за автоматического пропуска алгоритмом копирования-вставки пустых строк... Вот этого же боюсь и здесь...

Добавлено через 5 минут
Месага - это слэнговое "message" )))
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
05.01.2013, 00:06
Да не может быть 6 часов...
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
05.01.2013, 00:09
Я тоже в шоке!
0
 Аватар для AndreA SN
1021 / 125 / 2
Регистрация: 26.08.2011
Сообщений: 1,219
Записей в блоге: 2
05.01.2013, 00:19  [ТС]
да я сам офигел когда время прогноза увидел)))
вообще у меня просто дурные объемы обработки инфы...
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
05.01.2013, 00:26
Ну выгрузка, естественно, дольше:
Заполнение 3 с
Транспонирование 2 с
Выгрузка на лист
1 минута 28 с
Но это же (250364, 100)

Добавлено через 58 секунд
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
Sub QWERT()
Dim i
Dim j
Dim mas1(100, 250364)
Dim mas2(250364, 100)
Dim t
t = Time
Randomize
 
For i = 0 To 250364
    For j = 0 To 100
     mas1(j, i) = Int(90 * Rnd + 10)
    Next j
Next i
MsgBox Format(Time - t, "hh:nn:ss")
t = Time
For i = 0 To 250364
    For j = 0 To 100
       mas2(i, j) = mas1(j, i)
    Next j
Next i
MsgBox Format(Time - t, "hh:nn:ss")
t = Time
Cells.ClearContents
Range(Cells(1, 1), Cells(UBound(mas2) + 1, UBound(mas2, 2))) = mas2
MsgBox Format(Time - t, "hh:nn:ss")
End Sub
Добавлено через 5 минут
А такой Dim mas2(22941, 210)
На заполнение и транспонирование вообще 0
Выгрузка 15 с
Ноут не на лампах случайно?
Может накал катодов увеличить
2
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
05.01.2013, 00:38
У меня похожий код отработал за:

Заполнили за 15,6875
Повернули за 5,203125
Выгрузили за 123,75

Хотя конечно работает как-то тяжело этот 2007... один раз завис...

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
Option Explicit
 
Sub tt()
    Dim i&, ii&
    Dim arr(1 To 210, 1 To 22941)
    Dim arr2(1 To 22941, 1 To 210)
    Dim tm!
 
    Application.ScreenUpdating = False
 
    tm = Timer
 
    For i = 1 To UBound(arr)
        For ii = 1 To UBound(arr, 2)
            arr(i, ii) = "R " & i & " C " & ii
        Next
    Next
    Debug.Print "Заполнили за " & Timer - tm
    tm = Timer
    For i = 1 To UBound(arr)
        For ii = 1 To UBound(arr, 2)
            arr2(ii, i) = arr(i, ii)
        Next
    Next
    Debug.Print "Повернули за " & Timer - tm
    tm = Timer
    [a1].Resize(22941, 210) = arr2
    Debug.Print "Выгрузили за " & Timer - tm
 
    Application.ScreenUpdating = True
End Sub
Но ничего нигде не пропало - у меня все ячейки пронумерованы!
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
05.01.2013, 00:44
А что там в ячейку пишет у ТС? Какой объём?
От размера и скорость сильно меняется
Эти R,C увеличили время в 3 раза(по крайней мере)
Заполнили за 4,6875
Повернули за 1,6875
Выгрузили за 43,29688
1
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
05.01.2013, 01:19
Ну да - я в начале сдуру через "-" эти числа связал - так Экс стал всё в дату конвертить, очень долго.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2013, 01:19
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru