Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/64: Рейтинг темы: голосов - 64, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 16.12.2019
Сообщений: 4

Копирование данных из одного многомерного массива в другой

21.01.2020, 20:04. Показов 12521. Ответов 24

Студворк — интернет-сервис помощи студентам
Возможно ли скопировать данные с одного двухмерного массива в другой и если можно, то как это сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.01.2020, 20:04
Ответы с готовыми решениями:

Копирование данных из одного массива в другой
Написать программу, в которой создаются два массива типа char. В одном из массивов должен быть любой инициализированный текст, а в...

Копирование из одного массива в другой массив одного объекта
Пытаюсь скопировать дного массива в другой массив один объект, но не выходит. Условие следующее. - есть созданные массивы: public...

Копирование из одного массива в другой
Знаю два варианта копирования из одного массива в другой 1. С помощью функции memcpy char src = "Hello"; char dst =...

24
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
21.01.2020, 21:07
UnReality, метод Array.Copy(...)
1
0 / 0 / 0
Регистрация: 16.12.2019
Сообщений: 4
21.01.2020, 21:44  [ТС]
а как он реализуется для 2х мерных массивов? ибо я находил только реализацию для одномерного

Добавлено через 2 минуты
а как он реализуется для 2х мерных массивов? ибо я находил только реализацию для одномерного
0
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
21.01.2020, 23:05
Можно вручную, через два цикла, но это не очень оптимально.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
22.01.2020, 00:43
Цитата Сообщение от UnReality Посмотреть сообщение
а как он реализуется для 2х мерных массивов? ибо я находил только реализацию для одномерного
Так же как и одномерного - ему без разницы.
Свойств Length и там, и там.
По его длине и копируйте. Главное чтобы размерности совпадали.
C#
1
2
3
int[,] array ={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
int[,] arrayCopy =new int[array.GetLength(0), array.GetLength(1)];
Array.Copy(array, arrayCopy, array.Length);
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
22.01.2020, 08:47
amator_C, это самый оптимальный способ
0
28 / 13 / 8
Регистрация: 19.11.2015
Сообщений: 129
22.01.2020, 09:18
Рядовой, не самый))
в одном случае это копирование скопом и целиком за одну операцию, а в другой циклом, который априори НЕ оптимальней, НО зато более гибкий и универсальный - с этим соглашусь.
0
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
22.01.2020, 10:55
NikolaSN,
Цитата Сообщение от NikolaSN Посмотреть сообщение
скопом и целиком за одну операцию
а как реализовано скопом за одну операцию? Вы думаете, если вся реализация спрятана в методе, который не видно, то это значит быстрее?
0
28 / 13 / 8
Регистрация: 19.11.2015
Сообщений: 129
22.01.2020, 14:11
Рядовой, Pilarentes, Вы правы)
Сделал замеры и был удивлён.
на массиве [25000,25000] Array.Copy() работает аж в 20 раз медленнее чем через двойной цикл "for i for j"
Массивы больше размерности выдавали OutOfMemoryException даже на х64, что логично ))
0
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
22.01.2020, 14:34
Все же копирование циклами не очень оптимально, но реализация метода Copy() вряд ли будет очень уж низкоуровневой, всё таки C#. С другой стороны, если Copy() более медленный, что меня удивило, то у нас и остаются только циклы.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
22.01.2020, 16:09
Цитата Сообщение от amator_C Посмотреть сообщение
Все же копирование циклами не очень оптимально
а что может быть более оптимально? Вы верите в существование неких низкоуровнивых сущностей, способных копировать массивы не проходя по всем данным в них?
1
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
22.01.2020, 16:12
Ну, подождите, эти данные занимают какое-то место в памяти, если бы эту память как-то привязать к новому массиву, это и было бы низкоуровневое решение.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
22.01.2020, 16:19
amator_C, можно. И это есть, если просто присвоить новому массиву ссылку на старый. Но данные останутся старые в единственном экземпляре. Просто доступ к ним будет из 2-х мест.
А копирование подразумевает создание новой структуры, которую невозможно сделать не проходя по всем данным
0
260 / 165 / 54
Регистрация: 03.05.2019
Сообщений: 339
22.01.2020, 16:29
Может и так, я тоже про это подумал. Интересно, может есть какой-то механизм копирования области памяти целиком...
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.01.2020, 16:46
Цитата Сообщение от Pilarentes Посмотреть сообщение
Вы думаете, если вся реализация спрятана в методе, который не видно, то это значит быстрее?
нет, но наверняка она учитывает SIMD инструкции, умеет выравнивать данные и копировать максимально возможными кусками, давать хинты кэшу.
Цитата Сообщение от NikolaSN Посмотреть сообщение
Сделал замеры и был удивлён.
на массиве [25000,25000] Array.Copy() работает аж в 20 раз медленнее чем через двойной цикл "for i for j"
а покажете код замеров?
у меня результат такой, фор рядом не стоял, это 2500х2500, 3х4 примерно та же картина
Bash
1
2
3
4
5
| Method |     Mean |     Error |    StdDev | Rank |
|------- |---------:|----------:|----------:|-----:|
|    For | 46.12 ms | 0.3558 ms | 0.3328 ms |    3 |
|   Copy | 10.45 ms | 0.2058 ms | 0.3265 ms |    1 |
|  Block | 10.69 ms | 0.2126 ms | 0.3310 ms |    2 |
2
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
22.01.2020, 16:47
Цитата Сообщение от amator_C Посмотреть сообщение
Интересно, может есть какой-то механизм копирования области памяти целиком...
Вообще-то Array.Copy(...) и предназначен копировать область памяти целиком на низком уровне.

Странные результаты теста. Скорее всего, где-то ошибка или сработала преждевременная оптимизация.

Добавлено через 30 секунд
Цитата Сообщение от КОП Посмотреть сообщение
у меня результат такой, фор рядом не стоял,
Вот это похоже на правду.
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.01.2020, 16:48
Цитата Сообщение от amator_C Посмотреть сообщение
Copy() вряд ли будет очень уж низкоуровневой, всё таки C#.
вызывается внешний метод из CLR, который на c++
C#
1
2
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
internal static extern void Copy(...)
1
28 / 13 / 8
Регистрация: 19.11.2015
Сообщений: 129
22.01.2020, 16:57
да простой код-то.
1. Создал 2 массива 25к на 25к
2. Сделал Copy(), рассчитав разницу по времени ДО выполнения и ПОСЛЕ выполнения
3. Сделал FOR FOR, рассчитав разницу по времени ДО выполнения и ПОСЛЕ выполнения

Тайминг был у Copy() порядка 42-46 секунд из 10 замеров
Тайминг был у for for около 2,1-2,2 секунды также где-то с десяток замеров.

По-этому я и удивлён был почему так, а не иначе.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.01.2020, 17:16
Цитата Сообщение от NikolaSN Посмотреть сообщение
По-этому я и удивлён был почему так, а не иначе.
если хотите по существу, то таки лучше код показывать. А то гадать, есть ли прогрев, не используете ли datetime и т.д неблагодврное занятие.
Но судя по разнице таймингов, у вас там вообще не то замеряется, может таймером пару лишних строк зацепили
0
28 / 13 / 8
Регистрация: 19.11.2015
Сообщений: 129
22.01.2020, 17:24
КОП, нарыл код))

C#
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
       private void button1_Click_1(object sender, EventArgs e)
        {
            int[,] arr = new int[23000, 23000];
            int[,] arrCopy = new int[23000, 23000];
            for (int i = 0; i < 23000; i++)
            {
                for (int j = 0; j < 23000; j++)
                {
                    arr[i, j] = 0;
                }
            }
 
            DateTime dt = DateTime.Now; // Start
            Array.Copy(arr, arrCopy, arr.Length);
            textBox1.Text = Convert.ToString((DateTime.Now - dt).Seconds); // End
        }
 /*       private void button1_Click_1(object sender, EventArgs e)
        {
            int[,] arr = new int[23000, 23000];
            int[,] arrCopy = new int[23000, 23000];
            for (int i = 0; i < 23000; i++)
            {
                for (int j = 0; j < 23000; j++)
                {
                    arr[i, j] = 0;
                }
            }
 
            DateTime dt = DateTime.Now; // Start
            Array.Copy(arr, arrCopy, arr.Length);
            textBox1.Text = Convert.ToString((DateTime.Now - dt).Seconds); // End
        }*/
 
    }
Добавлено через 57 секунд
проблематично было найти в мусорке, долго)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.01.2020, 17:24
Помогаю со студенческими работами здесь

Копирование одного массива в другой
Всем добрый день. Насколько мне известно использование имени массива без индекса образует указатель на первый элемент массива. В программе...

Копирование одного массива в другой
Как массив из одного вытащить в другой!?

Копирование данных с одного листа на другой
Народ у меня такая проблема то что мне надо создавать документ, и даннве с 1 листа должны копироваться на другом как мне проще слелать это...

Копирование данных из одного файла в другой
Написать программу, которая копирует данные из одного файла в другой, но при этом меняет каждый третий символ на латинский символ X на С++

Копирование данных с одного листа на другой
Помогите, пожалуйста, написать процедуру на нажатие кнопки. Нужно выделить строку, нажать кнопку и данные из ячеек выделенной строки должны...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через 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-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru