Матрица перестановок для изменения представления от основного столбца к главному ряду в 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'),

Другие вопросы по тегам