Подтвердить что ты не робот

Использование транспонирования против ctranspose в MATLAB

При переносе векторов/матриц в MATLAB я видел и использовал только оператор ' (apostropohe) в течение длительного времени.

Например:

>> v = [ 1 2 3 ]'

v = 

    1
    2
    3

Однако это сопряженный транспонирование, как я недавно узнал, или ctranspose.

Это, по-видимому, имеет значение только при наличии сложных чисел, где, если вы хотите перенести матрицу без получения сопряжения, вам нужно использовать операнд .'.

Хорошо ли использовать также .' для реальных матриц и векторов? Что мы должны преподавать новичкам MATLAB?

4b9b3361

Ответ 1

Интересный вопрос!

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

  • Концептуальная ясность: если вам нужно транспонировать, просто транспонируйте. Не бросайте ненужное спряжение. Это плохая практика. Вы привыкнете писать ' для транспонирования и не заметите разницы. Однажды вы напишете ', когда нужно использовать .'. В качестве вероятных иллюстраций этого, см. этот вопрос или этот.

  • Будущее-взрывозащищенности. Если в один прекрасный день в будущем вы примените свою функцию к сложным входам, поведение внезапно изменится, и вам будет трудно найти причину. Поверь мне, я знаю, что я говорю 1.

Конечно, если вы используете реальные входы, но сопряжение будет иметь смысл для сложных входов, используйте '. Например, если вы определяете точечный продукт для вещественных векторов, может быть целесообразно использовать ', потому что если вы хотите использовать сложные входы в будущем, сопряженный транспонирование будет иметь больше смысла.

1 В мои ранние дни Matlab мне потребовалось некоторое время, чтобы отследить определенную проблему в моем коде, что оказалось вызвано использованием ', когда я должен использовали .'. Меня действительно расстроило то, что мой профессор сказал, что ' означает транспонирование! Он забыл упомянуть о конъюгате и, следовательно, о моей ошибке. Уроки, которые я узнал: ' не .'; и профессора могут рассказать вам все, что просто неправильно:-)

Ответ 2

Мое очень предвзятое мнение: большинство случаев, которые я использую ', являются чисто "формальными", иначе говоря, не связанными с математическими вычислениями. Скорее всего, я хочу повернуть вектор, подобный индексной последовательности 1:10, на 90 градусов.

Я редко использую ' для матриц, так как он неоднозначный - первый вопрос, на который вы должны ответить, - это то, почему вы хотите сделать транспонирование?

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

Чтобы транспонировать матрицу для математического вычисления, я явно использую transpose и ctranspose. Потому что при этом код легче читать (не нужно фокусироваться на этих крошечных точках) и отлаживать (не нужно заботиться о недостающих точках). Выполняйте следующие задания, такие как точечный продукт, как обычно.

Ответ 3

На самом деле это тема дебатов среди многих программистов MATLAB. Некоторые говорят, что если вы знаете, что делаете, тогда вы можете использовать ', если знать, что ваши данные являются чисто реальными, и использовать .', если ваши данные сложны, Тем не менее, некоторые люди (например, Луис Мендо) выступают за то, что вы обязательно должны использовать .' все время, чтобы вы не путались.

Это позволяет правильно обрабатывать ввод в функции, если данные, которые ожидаются для ваших входов в эти функции, оказываются сложными. Существует время, когда требуется сложная транспозиция, такая как вычисление квадрата величины комплексного вектора. Фактически, Loren Shure в одном из своих дайджестов MATLAB (я не помню, какой из них...) заявил, что это один из причины, по которым была введена сложная транспозиция.


Мое предложение состоит в том, что вы должны использовать .' всегда, если ваша цель - переносить данные. Если вы хотите выполнить сложную арифметику, используйте ' и .' в зависимости от того, какую операцию/вычисление вы делаете. Очевидно, что Луис Мендо удалил мне хорошую практику.

Ответ 4

Здесь различают два случая:

  • Принимая транспонирование для не-математических причин, например, у вас есть функция, которая обрабатывает данные как массивы, а не математические векторы, и вам нужен ваш исправляющий ошибку ввод, чтобы получить его в ожидаемом формате.
  • Принимая транспонирование как математическую операцию.

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

В первом случае я предлагаю не использовать оператор транспонирования. Вместо этого вы должны либо использовать reshape, либо просто настаивать на том, чтобы входной код выполнялся корректно и выдавал ошибку, если это не так. Это явно отличает этот экземпляр "компьютерной науки" от истинных математических случаев.