2013-03-23 11 views
0

Я хотел бы использовать оператор (:) и транспонировать в одно и то же время. Это возможно? В основном я хотел бы сделать что-то вродеMatlab: векторизовать транспонирование в один шаг?

output = A'(:) 

кроме этого не работает. Кто-нибудь знает обходной путь?

Спасибо!

ИММО

ответ

3

: оператор в этом случае является сокращением для изменения формы матрицы в вектор. Вы можете обойти ограничения, где используется оператор с помощью функции reshape явно:

octave> A = [1 2;3 4] 
A = 

    1 2 
    3 4 

octave> B=A' 
B = 

    1 3 
    2 4 

octave> C=B(:) 
C = 

    1 
    2 
    3 
    4 

octave> D=reshape(A',[],1) #% vectorize transpose in one line 
D = 

    1 
    2 
    3 
    4 
2

Попробуйте с:

output = reshape(A.', numel(A), 1); 

>> A = rand(4,3); 
>> output = reshape(A.', numel(A), 1); 

A = 

    0.447213 0.046896 0.679087 
    0.903294 0.768745 0.651481 
    0.701071 0.122534 0.611390 
    0.535844 0.478595 0.772810 

output = 

    0.447213 
    0.046896 
    0.679087 
    0.903294 
    0.768745 
    0.651481 
    0.701071 
    0.122534 
    0.611390 
    0.535844 
    0.478595 
    0.772810 

Берегитесь, что Reshape считывает матрицы доступа вдоль столбцов, так что вы, возможно, не потребуется транспонировать матрицу А.

Кроме того, помните, что оператор ' является эрмитовым оператором, а именно сопряженным транспонированным, тогда как .' - это просто транспозиция, Получаем также транспонирование (A).

Возможно, вы захотите сделать все в одной строке, не перепечатывая каждый раз. Одним из решений является создание дескрипторов функций в виде бункера:

>> boop = @(x) reshape(transpose(x), numel(x), 1) 
>> output = boop(A) 

output = 

    0.447213 
    0.046896 
    0.679087 
    0.903294 
    0.768745 
    0.651481 
    0.701071 
    0.122534 
    0.611390 
    0.535844 
    0.478595 
    0.772810 
+0

спасибо, это работает – Immo

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