Сведение матрицы в MATLAB с индексами

У меня есть матрица X e.g = [a b; c d; e f].

Мне нужно создать еще одну матрицу, в которой перечислены позиции индекса и значения матрицы.

например Выход E = [ 1 1 a ; 1 2 b ; 2 1 c ; 2 2 d ; 3 1 e ; 3 2 f ]

Я пытался использовать двойной цикл for, но даже если он сработал, это звучит как плохая идея.

Так может ли кто-нибудь лучше выполнить вышеуказанную задачу?


person atlantis    schedule 01.02.2012    source источник
comment
Являются ли a, b, c, d, e и f скалярами? Или это могут быть матрицы?   -  person Pursuit    schedule 01.02.2012


Ответы (2)


Вот самая глупая вещь, которую я мог придумать (предполагая, что a,b,c,d,e,f все скаляры)

x = [1 2;3 4;5 6];
[i,j]=ind2sub(size(transpose(x)), 1:numel(x));
[j(:) i(:) reshape(transpose(x),[],1)]

Однако у меня есть ощущение, что может быть более элегантный ответ.

person Andrey Rubshtein    schedule 01.02.2012
comment
Это очень хорошо. Вы можете немного улучшить читаемость, заменив transpose(x) на x' и переписав последнюю строку как [j(:) i(:) reshape(x',[], 1)] - person Pursuit; 01.02.2012
comment
@Pursuit, спасибо за совет. Мне нравится транспонировать больше, чем тег, потому что, когда кто-то читает его, он легко его замечает. Другое, что вы сказали, верно на 100% - я обновлю. - person Andrey Rubshtein; 02.02.2012

В ответе @Andrey нет ничего плохого, но потому что мне нравится находить причины для использования kron :)

A = [1 2; 3 4; 5 6];

[nrows, ncols] = size(A);

M = [kron([1 : nrows]', ones(ncols, 1))...
    kron(ones(nrows, 1), [1 : ncols]')...
    reshape(A', [], 1)]
person dantswain    schedule 01.02.2012