Разделить 2D-массив в C++ / C на подмассив

У меня есть 2D-массив C[100][10], я хочу разделить его столбец за столбцом и вставить в 1D-массив, как показано ниже:

C[100][10] разделен на C[0:100][0], C[0:100][1], ..., C[0:100][10] и вставьте разделенные массивы в одномерный массив, например: A[100] =C[0:100][0]

Я могу делать все это с помощью циклов for, но это занимает много времени, и время критично для моего проекта. есть ли способ решить эту проблему, исключая цикл for

Это C++ или C? Решение может сильно отличаться в C и C++.

4386427 04.12.2018 09:53

Вам нужно только сделать for в for. Неужели на это уходит много времени?

Yves 04.12.2018 09:53

Вы должны сохранить массив как C [10] [100]. Затем вы можете получить доступ к каждому подмассиву с помощью C [i]. Такой доступ к памяти должен быть немного быстрее.

Thomas Sablik 04.12.2018 09:53

Цитата: «Я могу сделать все это с помощью циклов for ...» Затем опубликуйте этот код, чтобы мы могли видеть, что вы делаете. Это также прояснит вопрос. В настоящее время мы даже не знаем тип данных.

4386427 04.12.2018 09:56

@ 4386427 В C++

Alexanov 04.12.2018 10:11

@Yves, да, проводите много времени, моя единица времени - миллисекунда

Alexanov 04.12.2018 10:13

@Alexanov хорошо, C++ тогда ... (тег C удален). Вам все равно нужно опубликовать свое текущее «медленное» решение.

4386427 04.12.2018 10:17

Если вам не нужны явные циклы for, вы можете использовать некоторые из функций <algorithm>.

Bob__ 04.12.2018 11:05

@ Боб, ты можешь сказать мне, как я могу использовать для своих целей?

Alexanov 04.12.2018 11:57

На это не следует тратить слишком много времени. Думаю, время уходит на копирование объекта. Если это так, вы можете просто использовать указатель.

Yves 04.12.2018 12:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
1 252
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны использовать массив субмассивов, например:

std::array<std::array<TYPE, 100>, 10> C;

Затем элементы каждого подмассива последовательно сохраняются в памяти, и операции выполняются быстрее. std :: array предоставляет оператора копирования

std::array<TYPE, 100> A = C[i];

Спасибо, ваше решение очень полезно, но если я хочу получить доступ к одному столбцу, как я могу это сделать?

Alexanov 10.12.2018 10:47

@Alexanov Если вы можете подготовить вышеуказанный массив массива, вы также можете подготовить вектор вектора. Затем вы можете разделить матрицу в течение ~ 1 мс на std::move, например это. Почему бы этого не сделать?

Hiroki 10.12.2018 18:04

@Hiroki Я видел ваше решение, вы можете сказать мне, как я могу получить доступ к одной строке или столбцу с вектором? дайте мне пример, если вы можете показать вектор, например c[0:100][1] или c[1][0:10]

Alexanov 11.12.2018 07:15

@Alexanov _1th_column, ..., _10th_column в моем ответе все std::vector<Foo>. Таким образом, мы можем получить доступ к каждому элементу каждого столбца, например это. Не могли бы вы указать на это, если я неправильно понимаю вашу проблему :).

Hiroki 11.12.2018 07:26

@Hiroki У меня есть матрица c[100][10]. Я хочу разбить массив 2d и заменить в массиве 1D. сначала разделите c из строки, например A=c[1][0:10]T, во-вторых, разделите c из столбца, например B=[0,100][1]

Alexanov 11.12.2018 07:35

@Alexanov А, понятно. Я думаю, что одним из возможных подходов было бы использование std::valarray с std::slice. Используя его, вы можете получить доступ к строкам и столбцам как к единому вектору. (Но медленно? Я этого не знаю.)

Hiroki 11.12.2018 07:50

@Hiroki можно ли привести пример?

Alexanov 11.12.2018 08:21

@Alexanov Как насчет это? Я определил простой матричный класс с std::vector и главным столбцом вместо std::valarray. Этот матричный класс имеет функции-члены для получения средств доступа к строкам и столбцам без копирования объекта. Это моя быстрая реализация и, пожалуйста, будьте осторожны с болтающимися элементами :). Также работает простой упаковка с помощью лямбда-выражений.

Hiroki 11.12.2018 17:15

@Hiroki мне твой пример не понятен. Моя проблема очевидна: если у нас есть матрица 2 * 3 со случайным числом в ячейках, как я могу получить доступ к строке и столбцу?

Alexanov 15.12.2018 12:55

@Hiroki извините, но я должен сказать, что да, я хочу очень простой пример

Alexanov 16.12.2018 12:36

Другие вопросы по теме