2013-04-23 4 views
1

Предположим, что у нас есть матрица 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)

+0

Действительно ли вам нужен результат этого конкретного типа данных матрицы (или иначе нужно изменить матрицу)? Поскольку мне кажется, что самый эффективный способ сделать это, можно написать класс 'matrix_view', который действует как нормальная матрица, но изменяет индексы доступа, чтобы опустить столбцы, поскольку это освободит вас от фактического выполняя копию. – Grizzly

ответ

1

Я думаю, вы должны быть осторожны, чтобы использовать 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 

Поскольку вы знаете, какой столбец удалить, вы будете знать диапазон индексов массива 1D, который вы использовали для хранения 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 столбец исходных матриц.

Теперь вы можете использовать свою библиотеку Matrix для умножения A и A_T(2) и получить матрицу результатов.

+0

Да, все, что вы написали, довольно ясно, и у меня не было проблемы с пониманием математики, стоящей за проблемой. Вопрос заключается в том, как быстро получить массив 'b = [1,4,7,3,6,9]' из 'a = [1,0,0,0,0,1]' с использованием C++. 2 основных вопроса: сложность времени и пространства. Я нацеливаю матрицы с возможными миллиардами элементов –

+0

@ user2028058, если вам нужно всего лишь получить b при удалении 2-го столбца, я думаю, вы можете сделать это непосредственно в массиве, так как вы знаете, что второй столбец для удаления, тогда вам нужно удалить записи с индексами в [3,5], в этом случае это 2,5,8. Тебе даже не нужно больше, я думаю. – taocp

+0

это очевидный способ грубой силы. Ходовая петля m * n раз и копирование необходимых элементов в b. Представьте, что вы выполняете эту операцию m * n для каждой перестановки удаленных столбцов A .. –

Смежные вопросы