Матрица перестановок для изменения представления от основного столбца к главному ряду в Matlab
У меня есть 2D-массив в Matlab, который необходимо преобразовать в 1D, и Matlab использует для преобразования главное представление столбца. Однако я хотел бы использовать дважды стохастическую матрицу для преобразования представления в мажорную строку.
Например, у меня есть следующий 2D-массив:
M = [1,2,3;4,5,6]
Если я использую Reshape, чтобы представить его в 1D
v1 = reshape(M,size(M,1)*size(M,2),1)
Я получаю основные представления столбца:
v1 = [1,4,2,5,3,6]
Тем не менее, я хотел бы использовать матрицу перестановок, как это:
A = [1,0,0,0,0,0;
0,0,1,0,0,0;
0,0,0,0,1,0;
0,1,0,0,0,0;
0,0,0,1,0,0;
0,0,0,0,0,1];
так что я получаю следующее главное представление строки:
v2 = [1,2,3,4,5,6]'
при выполнении
v2 = A*v1
Я знаю, что я могу получить v2, просто делая
v2 = reshape(M',size(M,1)*size(M,2),1)
Но я особенно хочу создать матрицу перестановок, чтобы преобразовать ее в главное представление строки.
Если бы кто-то мог помочь мне сгенерировать эту матрицу перестановок, это действительно помогло бы. Заранее спасибо!
2 ответа
Вы можете использовать следующее:
M = [1 2 3; 4 5 6];
ind = reshape(1:numel(M), size(M,1), []).';
A = accumarray([(1:numel(M)).' ind(:)], 1);
Обратите внимание, что ваш код
v2 = reshape(M',size(M,1)*size(M,2),1)
потерпит неудачу, если M
это сложно. Для транспонирования используйте .'
вместо '
,
Вы можете создать свою матрицу A
используя линейную индексацию. Элементы в матрице могут быть проиндексированы с одним индексом, после чего они адресуются по столбцам в том же порядке, в котором они появляются при преобразовании матрицы в вектор.
Вам необходимо установить элемент в каждом нечетном столбце, где элемент находится на единицу ниже предыдущего столбца:
n = numel(M);
A = zeros(n,n);
A(1:2*n+1:end) = 1;
А также по одному в каждом четном столбце аналогичным образом:
A(n+n/2+1:2*n+1:end) = 1;
Это работает для всех матриц M
с двумя рядами. Для матрицы с m
Количество строк:
[m,k] = size(M);
n = numel(M); % == m*k
index = 1:m*n+1:n*n;
offset = 0:n+k:m*n;
index = index + offset'; % requires newer MATLAB
A = zeros(n,n);
A(index(:)) = 1;
Если строка, которая требует более новой версии MATLAB, выдает ошибку, замените ее на bsxfun(@plus,index,offset')
,