Предположим, что у нас есть матрица A (m*n)
хранится в упакованном виде (1-й массив размера m*n
— с ведущими размерами — столбцы). Мне нужно получить уменьшенные матрицы A(S)
— которые являются результатом удаления 1 или более столбцов из A
, Я могу легко сделать это вручную в циклах, но есть другой подход — использование матриц выбора I(S)
которые представляют собой единичные матрицы (все нули, кроме 1 по диагонали) с удаленным 1 или более столбцом. Тогда, например, если мне нужно удалить 3-й ряд из A
Мне нужно сформировать I(3)
— личность без 3-го столбца, а затем A(3)=A*I(S)
, И так как мне нужно много вариантов A
Мне бы понадобились все разные тождественные матрицы I(S)
с разными столбцами удалены.
Я думаю об этом, потому что я использую 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]
,
Это может быть сделано непосредственно на матрице А, которая будет принимать 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)
Я думаю, что вы должны быть осторожны, чтобы использовать I
если ты имеешь ввиду identity matrix
, Identity matrix
как правило, квадратная матрица, в то время как вы используете обычно не квадратную матрицу, так как вы удалили столбец (столбцы) из исходной матрицы. Позвольте мне назвать матрицу преобразования как T
, вместо I
,
Сейчас я пытаюсь ответить на ваш вопрос:
вопрос в том, как быстро сформировать эти матрицы
так на основании вышеизложенного предположения, T(2)
должно быть:
1 0
0 0
0 1
поскольку
1 2 3 1 0 1 3
4 5 6 * 0 0 = 4 6
7 8 9 0 1 7 9
Вы можете сравнить T(2)
с оригинальным I(3)
(здесь это единичная матрица) в зависимости от ситуации, когда вы удаляете второй столбец.
1 0 0
I(3) 0 1 0
0 0 1
Поскольку вы знаете, какой столбец удалить, вы будете знать диапазон индексов одномерного массива, который вы использовали для хранения I(3)
в данном случае это: A_I(3) = [1 0 0 0 1 0 0 0 1]
; Вы знаете этот индекс [3,5]
второй столбец, вам просто нужно удалить эти 3 значения, вы получите T(2)
как в приведенном выше примере, который A_T(2) = [ 1 0 0 0 0 1]
, Таким образом, идея заключается в том, что если вы знаете, какой столбец исходной матрицы удалить, вы просто удалите значения из 1D-массива, в котором хранится единичная матрица в пределах диапазона индекса, в который отображается исходный столбец. В этом примере вы удаляете значения из [3,5]
который 2nd
столбец исходной матрицы отображается на.
Теперь вы можете использовать свою матричную библиотеку для умножения A
а также A_T(2)
и получить матрицу результатов.
Других решений пока нет …