Это если мой первый пост, надеюсь, я буду соответствовать стандартам …
Я перевожу на C ++ (на котором я совсем новый) программа, изначально написанная на MATLAB по соображениям эффективности. Часть кода, над которой я фактически работаю, возобновляет доступ к различным индексам вектора (матрицы) за один шаг. Например, если M1 — это матрица размера, скажем, 10×15, программа определит новую, как показано ниже:
idxs1 = [1 2 3];
idxs2 = [1 2 3 4 5];
M2 = M1 (idxs1 , idxs2);
в результате М2 в виде матрицы размером 3х5. Теперь, я думаю, что MATLAB на самом деле это один за другим доступ к различным местам M1, заданным индексами, а затем построение M2 путем реорганизации полученного содержимого, все очень эффективно.
У меня вопрос, как я могу воспроизвести такой механизм в C ++? Насколько я знаю, нет прямого способа доступа к различным индексам массива, и for
цикл, который я использую, кажется довольно громоздким. Может быть, есть какой-то разумный способ сделать это, не требуя «слишком много» процессорного времени? Также, ради образовательных целей, я был бы признателен, если бы кто-то мог объяснить, что на самом деле делает MATLAB, когда такая операция выполняется.
Заранее благодарим и извините за возможные неудобства!
П.С .: На всякий случай, если это что-то добавляет к вопросу, я работаю с MEX файлы для связи обоих языков.
P.S2: Кстати, я нашел несколько связанных вопросов, но относительно других языков:
«Armadillo — это высококачественная библиотека линейной алгебры C ++, нацеленная на достижение хорошего баланса между скоростью и простотой использования.
Полезно для разработки алгоритмов непосредственно на C ++ или для быстрого преобразования исследовательского кода в производственные среды; синтаксис (API) намеренно похож на Matlab
Ссылка на сайт: http://arma.sourceforge.net/
Структуры данных математических программ могут быть одними из самых сложных. Я даже не могу понять, что на самом деле делает 3-я строка вашего примера, поэтому я даже не могу догадаться, как MATLAB что-то реализует.
Что я могу вам сказать, так это то, что одна строка MATLAB почти наверняка скрывает массу операций. Если вы хотите воссоздать его, вам просто нужно создать служебную функцию с парой циклов for, которые копируют все правильные индексы один за другим. В конечном счете, это не может сильно отличаться от того, что делает MATLAB.
Если у вас есть тонна матричных операций, которые вам нужно поддерживать, и вы работаете над большим проектом, возможно, вы захотите найти библиотеку матриц C ++. Я не могу его порекомендовать, но Boost — это популярная библиотека C ++ для многих целей, включая матрицы. (Вы также можете создать собственную структуру данных, но не рекомендуется для новичков.)
Что такое MATLAB именно так Команда do не указана и может очень сильно отличаться в зависимости от индексов в зависимости от индексов, и даже для заданного набора индексов она может отличаться от машины к машине. Так что не будем спекулировать.
В частности, не указано, копирует ли MATLAB физически M1. Такая копия может быть подделана, что экономит время. Техника известна как «копирование при записи».
В C ++ это также возможно, но сложнее. Кроме того, ни один из существующих контейнерных классов не поддерживает это.
Если вы собираетесь копировать элементы, узким местом не будет процессор. Вместо этого шина памяти будет ограничивать вас. Это особенно верно, когда индексы не являются смежными. Для матрицы 3х5 время будет зависеть от накладных расходов — смежность пока не имеет значения.