【问题标题】:Using transpose versus ctranspose in MATLAB在 MATLAB 中使用转置与 ctranspose
【发布时间】:2014-08-05 23:38:32
【问题描述】:

在 MATLAB 中转置向量/矩阵时,我已经看到并使用了很长时间的 '(撇号)运算符。

例如:

>> v = [ 1 2 3 ]'

v = 

    1
    2
    3

然而,这是我最近发现的共轭转置,或ctranspose。

这似乎只在涉及复数时才重要,如果您想在不获得共轭的情况下转置矩阵,则需要使用 .' 运算符。

那么将.' 用于实数矩阵和向量是否是一种好习惯?我们应该教 MATLAB 初学者什么?

【问题讨论】:

  • 嗨@rayryeng,谢谢!我最近看到了您对一些 Matlab 帖子的回复!我敬畏。一直在潜伏,终于有一点勇气开始投稿了。您、Luis Mendo 和 Yvon 之间的精彩对话。
  • @legas 做出贡献是个好主意。通过回答和查看其他人的答案,您会发现自己学到了很多东西。通过这种方式,我的 Matlab 技能提高了很多。但请注意,它可能非常容易上瘾 :-)
  • @LuisMendo - 我绝对同意。我拥有一个 SO 帐户已有 6 个月,但直到大约 3 个月前我才开始积极回答问题。 3 个月多来,我获得了大约 6500 名声望....回答问题很容易上瘾!
  • +1 好问题。即使您与复数无关,区分' 和.' 也是一种很好的做法。很像avoiding the use of i and j as variable names。
  • 有一件事忘了说。我真的对. 感到困惑尝试遵循模式-“A.*B 中的. 意味着在A 和B 中的每个元素 上执行*;. A./B中的/表示对A和B中的每个元素执行.'A.'中的'表示对???执行'在 A 中??它对矩阵的“元素转置”有多大意义?如果我是学生,我怎么能在 .* 和 .' 之间建立类比?

标签: arrays matlab matrix


【解决方案1】:

有趣的问题!

我肯定会说,当您只想转置时使用.' 是一个好习惯,即使数字是真实的,因此' 也会产生相同的效果。主要原因是:

  1. 概念清晰:如果需要转置,只需转置即可。不要加入不必要的共轭。这是不好的做法。你会习惯于写' 来转置并且不会注意到其中的区别。有一天你会在应该使用.' 时写'。作为可能的说明,请参阅 this question 或 this one。

  2. 面向未来。如果在未来的某一天你将你的函数应用于复杂的输入,行为会突然改变,你将很难找到原因。相信我,我知道我在说什么1。

当然,如果您使用的是实数输入,但共轭对复杂输入有意义,请使用'。例如,如果您要为实数向量定义点积,则使用' 可能是合适的,因为如果您希望将来使用复杂的输入,共轭转置would make more sense。

1 在我早期的 Matlab 时代,我花了相当长的时间来追溯我的代码中的某个问题,结果证明这是我应该使用 ' 引起的已使用.'。真正让我不爽的是,我的教授居然说'是转置的意思!他忘了提到共轭,因此我的错误。我学到的教训:' 不是.';教授可以告诉你一些完全错误的事情:-)

【讨论】:

  • 哈哈哈!我在我的帖子中提到了你......看看谁决定写一个:) +1 来自我
  • @rayryeng 我忍不住回答。你知道我对此有多么强烈的感受:-)
  • 谢谢你,是的,我也被教导',同样的问题也发生在我身上,我花了很长时间才找到它。 :)
  • @legas - 我记得我第一次遇到这种轻微的(但灾难性的)差异。我自己实现了 DFT,没有使用任何内置函数。要进行矢量化,这需要您计算一个复数系数矩阵。要进行逆运算,您只需转置矩阵。我花了几个小时才弄清楚为什么它不起作用...那是因为我使用了' 而不是.'... d'oh!像 Luis 一样,这种体验让 ' 和 .' 的概念根深蒂固,永远留在你的脑海中。
  • 我对 Stack Overflow 礼仪还是比较陌生,能接受大家的回答吗?否则我会选择这个,因为@LuisMendo 有“Matlab 的' 不是转置;.' 是。”在他的个人资料中哈哈!
【解决方案2】:

我非常偏颇的观点:我使用的大多数情况 ' 纯粹是“正式的”,也就是与数学计算无关。很可能我想将 vector 像索引序列1:10 旋转 90 度。

我很少将' 用于矩阵,因为它模棱两可 - 您要回答的第一个问题是为什么要进行转置?

如果矩阵最初是在错误的方向定义的,我宁愿定义矩阵在正确的方向,但以后不要转动它。

为了数学计算转置矩阵,我明确使用transpose 和ctranspose。因为这样做代码更容易阅读(不必关注那些小点)和调试(不必关心丢失的点)。像往常一样做以下工作,如点积。

【讨论】:

  • 非常好。我同意毫不含糊的说法。 +1
  • 我在这里基本同意你的看法,除了我发现有时你会正确定义一个矩阵,在其上使用内置函数,而内置函数会神秘地转置它。我已经开始在我的代码中添加诸如 vectorOut = reshape(vectorOut,size(vectorIn)); 之类的语句来强制执行一致的矩阵形状。
  • @rayryeng 我也学会了歧义并以一种艰难的方式避免它。但幸运的是,在命名变量和选择函数(在实际输入代码之前!)时,我花了很长时间才学会谨慎。
  • @legas 如果您添加一个带有复数的示例会有帮助吗?
  • @Yvon - 每当我举办 MATLAB 研讨会时,这是我一直强调的一点,所以是的,一个例子总是好的。一个好处是向他们展示使用' 来计算复数向量的幅度平方。
【解决方案3】:

这实际上是许多 MATLAB 程序员争论的话题。有人说,如果您知道自己在做什么,那么如果您知道您的数据是纯粹真实的,那么您可以继续使用',如果您的数据很复杂,请使用.' .但是,有些人(例如Luis Mendo)主张您绝对应该始终使用.',以免您感到困惑。

这样可以正确处理函数的输入,以防您输入这些函数的预期数据确实很复杂。有时需要复杂的转置,例如计算复杂向量的幅度平方。事实上,Loren Shure 在她的一个 MATLAB 摘要中(我不记得是哪一个了……)指出这是引入复杂转置的原因之一。


我的建议是,如果您的目标是转置数据,则应始终使用 .'。如果你想做一些复杂的算术,那么根据你正在做的操作/计算使用' 和.'。显然,Luis Mendo 的良好做法对我产生了影响。

【讨论】:

  • 对于初学者来说,在使用 Matlab 的第一天区分' 和.' 可能太详细了。但是一旦引入了一个真正的问题,老师应该有责任向学生强调差异(可怜的路易斯:(
【解决方案4】:

这里有两种情况要区分:

  1. 出于非数学原因进行转置,例如您有一个将数据视为数组而不是数学向量的函数,并且您需要纠错输入以将其获取为您期望的格式。
  2. 将转置视为数学运算。

在后一种情况下,情况必须决定哪个是正确的,在这种情况下,可能只有两个选择中的一个是正确的。最常见的是采用共轭转置,对应于',但在某些情况下,您必须采用直接转置,然后当然需要使用.'。

在前一种情况下,我建议不要使用 either 转置运算符。相反,您应该使用reshape 或坚持输入正确,如果不正确则抛出错误。这清楚地将这些“计算机科学”实例与真正的数学实例区分开来。

【讨论】:

  • 对于任意矩阵,我不认为你可以用reshape 实现转置行为(你可以为向量)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 2017-04-29
  • 2016-12-04
  • 2013-06-05
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多