Использование transpose против ctranspose в MATLAB
При транспонировании векторов / матриц в MATLAB я видел и использовал только '
(апостропох) оператор давно.
Например:
>> v = [ 1 2 3 ]'
v =
1
2
3
Однако, как я недавно выяснил, это сопряженное транспонирование или ctranspose
,
Кажется, это имеет значение только тогда, когда речь идет о комплексных числах, где, если вы хотите транспонировать матрицу без получения сопряжения, вам нужно использовать .'
opertator.
Это хорошая практика, чтобы также использовать .'
для реальных матриц и векторов тогда? Чему мы должны учить новичков в MATLAB?
4 ответа
Интересный вопрос!
Я бы определенно сказал, что это хорошая практика .'
когда вы просто хотите транспонировать, даже если числа действительны и, таким образом, '
будет иметь такой же эффект. Основными причинами этого являются:
Концептуальная ясность: если вам нужно транспонировать, просто транспонируйте. Не добавляйте ненужное спряжение. Это плохая практика. Вы привыкнете писать
'
транспонировать и не заметит разницу. Однажды ты напишешь'
когда.'
должен быть использован. В качестве вероятной иллюстрации этого см. Этот вопрос или этот.Перспективность. Если однажды в будущем вы примените свою функцию к сложным входам, поведение внезапно изменится, и вам будет трудно найти причину. Поверьте мне, я знаю, что я говорю 1.
Конечно, если вы используете реальные входные данные, но сопряжение будет иметь смысл для сложных входных данных, используйте '
, Например, если вы определяете скалярное произведение для реальных векторов, может быть целесообразно использовать '
потому что, если вы захотите использовать сложные входные данные в будущем, транспонирование сопряжения будет иметь больше смысла.
1 В первые дни Matlab мне потребовалось много времени, чтобы отследить определенную проблему в моем коде, которая, как оказалось, была вызвана использованием '
когда я должен был использовать .'
, Что меня действительно расстроило, так это то, что мой профессор сказал, что '
имелось в виду транспонировать! Он забыл упомянуть сопряженное, а значит и мою ошибку. Уроки, которые я выучил: '
не является .'
; и профессора могут сказать вам вещи, которые явно неправильно:-)
Мой очень предвзятый взгляд: в большинстве случаев я использую '
являются чисто "формальными", иначе говоря, не связанными с математическими вычислениями. Скорее всего, я хочу повернуть вектор, как последовательность индекса 1:10
на 90 градусов.
Я редко использую '
к матрицам, так как это неоднозначно - первый вопрос, на который вы должны ответить, почему вы хотите сделать транспонирование?
Если матрица изначально определена в неправильном направлении, я бы лучше определил матрицу в правильном направлении, но не поворачивал ее впоследствии.
Чтобы транспонировать матрицу для математического расчета, я явно использую transpose
а также ctranspose
, Потому что при этом код легче читать (не нужно фокусироваться на этих крошечных точках) и отлаживать (не нужно заботиться о пропущенных точках). Выполните следующие действия, такие как точка продукта, как обычно.
Это на самом деле предмет спора среди многих программистов MATLAB. Некоторые говорят, что если вы знаете, что делаете, то можете пойти дальше и использовать '
если вы знаете, что ваши данные являются чисто реальными, и использовать .'
если ваши данные сложны. Тем не менее, некоторые люди (например, Luis Mendo) отстаивают тот факт, что вы должны обязательно использовать .'
все время, чтобы вы не запутались.
Это позволяет правильно обрабатывать ввод в функции в случае, если данные, которые ожидаются для ваших входов в эти функции, оказываются сложными. Существует время, когда требуется сложное преобразование, например, вычисление квадрата амплитуды сложного вектора. На самом деле, Лорен Шуре в одном из своих дайджестов MATLAB (я не помню, какой именно...) заявила, что это одна из причин, почему была введена сложная транспонирование.
Я предлагаю вам использовать .'
всегда, если вашей целью является транспонирование данных. Если вы хотите сделать сложную арифметику, то используйте '
а также .'
в зависимости от того, какую операцию / вычисления вы делаете. Очевидно, что хорошие практики Луиса Мендо отразились на мне.
Здесь можно выделить два случая:
- Принимая транспонирование по нематематическим причинам, например, у вас есть функция, которая обрабатывает данные как массивы, а не математические векторы, и вам нужен ввод с исправлением ошибок, чтобы получить их в ожидаемом формате.
- Принимая транспонирование как математическую операцию.
В последнем случае ситуация должна диктовать, что является правильным, и, вероятно, только один из двух вариантов является правильным в этой ситуации. Чаще всего это будет принимать сопряженное транспонирование, которое соответствует '
, но есть случаи, когда вы должны взять прямую транспонирование, а затем, конечно, вам нужно использовать .'
,
В первом случае я предлагаю не использовать ни один из операторов транспонирования. Вместо этого вы должны использовать reshape
или просто настаивайте на том, чтобы ввод был верным, и выдавайте ошибку, если это не так. Это четко отличает эти "информатические" экземпляры от истинных математических примеров.