У меня есть 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
Вам нужно только сделать for в for. Неужели на это уходит много времени?
Вы должны сохранить массив как C [10] [100]. Затем вы можете получить доступ к каждому подмассиву с помощью C [i]. Такой доступ к памяти должен быть немного быстрее.
Цитата: «Я могу сделать все это с помощью циклов for ...» Затем опубликуйте этот код, чтобы мы могли видеть, что вы делаете. Это также прояснит вопрос. В настоящее время мы даже не знаем тип данных.
@ 4386427 В C++
@Yves, да, проводите много времени, моя единица времени - миллисекунда
@Alexanov хорошо, C++ тогда ... (тег C удален). Вам все равно нужно опубликовать свое текущее «медленное» решение.
Если вам не нужны явные циклы for, вы можете использовать некоторые из функций <algorithm>.
@ Боб, ты можешь сказать мне, как я могу использовать для своих целей?
На это не следует тратить слишком много времени. Думаю, время уходит на копирование объекта. Если это так, вы можете просто использовать указатель.





Вы должны использовать массив субмассивов, например:
std::array<std::array<TYPE, 100>, 10> C;
Затем элементы каждого подмассива последовательно сохраняются в памяти, и операции выполняются быстрее. std :: array предоставляет оператора копирования
std::array<TYPE, 100> A = C[i];
Спасибо, ваше решение очень полезно, но если я хочу получить доступ к одному столбцу, как я могу это сделать?
@Alexanov Если вы можете подготовить вышеуказанный массив массива, вы также можете подготовить вектор вектора. Затем вы можете разделить матрицу в течение ~ 1 мс на std::move, например это. Почему бы этого не сделать?
@Hiroki Я видел ваше решение, вы можете сказать мне, как я могу получить доступ к одной строке или столбцу с вектором? дайте мне пример, если вы можете показать вектор, например c[0:100][1] или c[1][0:10]
@Alexanov _1th_column, ..., _10th_column в моем ответе все std::vector<Foo>. Таким образом, мы можем получить доступ к каждому элементу каждого столбца, например это. Не могли бы вы указать на это, если я неправильно понимаю вашу проблему :).
@Hiroki У меня есть матрица c[100][10]. Я хочу разбить массив 2d и заменить в массиве 1D. сначала разделите c из строки, например A=c[1][0:10]T, во-вторых, разделите c из столбца, например B=[0,100][1]
@Alexanov А, понятно. Я думаю, что одним из возможных подходов было бы использование std::valarray с std::slice. Используя его, вы можете получить доступ к строкам и столбцам как к единому вектору. (Но медленно? Я этого не знаю.)
@Hiroki можно ли привести пример?
@Alexanov Как насчет это? Я определил простой матричный класс с std::vector и главным столбцом вместо std::valarray. Этот матричный класс имеет функции-члены для получения средств доступа к строкам и столбцам без копирования объекта. Это моя быстрая реализация и, пожалуйста, будьте осторожны с болтающимися элементами :). Также работает простой упаковка с помощью лямбда-выражений.
@Hiroki мне твой пример не понятен. Моя проблема очевидна: если у нас есть матрица 2 * 3 со случайным числом в ячейках, как я могу получить доступ к строке и столбцу?
@Hiroki извините, но я должен сказать, что да, я хочу очень простой пример
Это C++ или C? Решение может сильно отличаться в C и C++.