Изменение представлений: верхняя треугольная матрица и компактный вектор (Octave/Matlab)

Дана матрица A, имеющая нули на диагонали и в нижней треугольной части:

A = triu(rand(5,5), 1) % example

A =
0.00000   0.47474   0.55853   0.30159   0.97474
0.00000   0.00000   0.03315   0.74577   0.20878
0.00000   0.00000   0.00000   0.54966   0.76818
0.00000   0.00000   0.00000   0.00000   0.82598
0.00000   0.00000   0.00000   0.00000   0.00000

Я хочу преобразовать A в компактный вектор v, который пропускает все нулевые элементы:

v = [0.47474 0.55853 0.30159 0.97474 0.03315
     0.74577 0.20878 0.54966 0.76818 0.82598]

Позже я хочу преобразовать вектор обратно в матрицу.

Вопрос. Как можно элегантно преобразовать эти два представления?


person Håvard Geithus    schedule 12.11.2012    source источник


Ответы (2)


Я бы начал с верхней треугольной матрицы единиц

B = triu(ones(5,5), 1)

И тогда v можно определить как:

v = A(B==1)

Преобразование обратно из v в A

A = B
A(B==1) = v
person dustincarr    schedule 12.11.2012
comment
Аккуратный ! и еще несколько персонажей - person High Performance Mark; 12.11.2012

Поскольку Matlab хранит массивы в порядке столбцов, я не мог сделать это в одном выражении, пока нет, но вот решение с двумя операторами:

B = A';

v = B(B~=0)'

Ответ @dustincarr делает мою дальнейшую работу излишней.

person High Performance Mark    schedule 12.11.2012