Предположим, что у нас есть матрица A (m*n)
, хранящаяся в упакованной форме (массив 1-мерного размера m*n
- с ведущими размерами - столбцы). Мне нужно получить уменьшенные матрицы A(S)
- которые получены при удалении 1 или более столбцов от A
. Я могу легко это сделать вручную в петлях, но есть другой подход - с использованием матриц выбора I(S)
, которые являются тождественными матрицами (все нули, но 1 с по диагонали) с удаленным 1 или более столбцами. Затем, например, если мне нужно удалить 3-й ряд из A
, мне нужно сформировать I(3)
- личность без третьей колонки, а затем A(3)=A*I(S)
. И так как мне понадобится много вариантов A
, мне нужны все разные идентичные матрицы I(S)
с удаленными столбцами.Удаление столбцов (ов) из матриц быстрым способом C++
Я так думаю, потому что я использую библиотеку Intel Math Kernel Library, которая чрезвычайно эффективна для матричных умножений.
Таким образом, вопрос, что вы думаете, самый быстрый способ формирования новой матрицы A(S)
: вручную, непосредственно работая с A
или первым формированием I(S)
- и вопрос заключается в том, как быстро сформировать эти матрицы - а затем умножая A*I(S)
или вы может предложить любое другое быстрое решение.
Для иллюстрации предположим, что мы имеем матрицу A
:
1 2 3
4 5 6
7 8 9
Он хранится в массиве A=[1,4,7,2,5,8,3,6,9]. Suppose I need to form
A (2) `, что это удалить 2-й столбец. Мне нужно, чтобы иметь на выходе:
1 3
4 6
7 9
, который хранится в C++, как A_S=[1,4,7,3,6,9]
. Это можно сделать непосредственно на матрице A, которая займет O(n^2)
времени и неэффективна для больших матриц. Или же мы можем сформировать I(2)
:
1 0
0 1
0 0
хранятся в C++, как I_S = [1,0,0,0,1,0]
. Тогда A(2) = A*I(2)
Действительно ли вам нужен результат этого конкретного типа данных матрицы (или иначе нужно изменить матрицу)? Поскольку мне кажется, что самый эффективный способ сделать это, можно написать класс 'matrix_view', который действует как нормальная матрица, но изменяет индексы доступа, чтобы опустить столбцы, поскольку это освободит вас от фактического выполняя копию. – Grizzly