Using transpose versus ctranspose in MATLAB
在MATLAB中对向量/矩阵进行转置时,我已经很长时间看到并仅使用'(撇号)运算符了。
例如:
1 2 3 4 5 6 7
| >> v = [ 1 2 3 ]'
v =
1
2
3 |
但是这是我最近发现的共轭转置,或者是ctranspose。
这似乎仅在涉及复数时才重要,如果要在不获取共轭的情况下转置矩阵,则需要使用.'运算符。
然后将.'也用于实际矩阵和向量是否是一种好习惯?我们应该教什么MATLAB初学者?
- 好问题:)...引起了很多讨论。很高兴在这里见到你!没见过你。
-
嗨@rayryeng,谢谢!我最近看到您对一些Matlab帖子的回复!我很敬畏我一直潜伏着,终于有勇气开始贡献自己的力量。您,Luis Mendo和Yvon之间的精彩对话。
-
不要害羞:)从一些您肯定可以回答的问题开始。我从处理简单的子集或索引到矩阵或任何处理plot的问题开始。当我开始学习Luis Mendo,Divakar,Amro,natan等提出的其他MATLAB函数时,我变得更加自信,这进一步巩固了我回答更多高级问题的基础。同样,回答有关MATLAB的问题也直接与您的研究/工作领域相关。我回答了很多图像处理问题。希望能再见到你!
-
@legas这是一个好主意。通过回答并看到其他人的答案,您会学到很多东西。这样,我的Matlab技能??有了很大的提高。但是请注意,这可能会令人上瘾:-)
-
@LuisMendo-我绝对同意。我有一个SO帐户已有6个月了,但直到大约3个月前我才开始积极回答问题。在3个月的时间里,我获得了大约6500的声誉。...回答问题非常容易上瘾!
-
1个好问题。即使您与复数无关,这也是区分'和.'的好习惯。就像避免使用i和j作为变量名一样。
-
一件事忘了提。我对.感到非常困惑,尝试遵循以下模式-" A.*B中的.意味着对A和B中的每个元素执行*; A./B中的.意味着执行在A和B中的每个元素上/;在A.'中的.'意味着对A中的???执行' ??它在多大意义上使"按元素转置"矩阵?我是学生,如何在.*和.'之间建立类比?
-
@Yvon是的,.'中的.表示法令人困惑。在这种情况下,这并不意味着"明智的"
有趣的问题!
我绝对会说,即使数字是实数,使用.'也是一个好习惯,即使数字是实数,因此'也会产生相同的效果。造成这种情况的主要原因是:
概念清晰:如果需要移调,只需移调即可。不要抛出不必要的变化。这是不好的做法。您将习惯于编写'进行转置,并且不会注意到差异。有一天,您应该在使用.'时写'。作为对此的可能说明,请参见此问题。
耐久。如果将来有一天您将功能应用于复杂的输入,则行为将突然改变,并且将很难找到原因。相信我,我知道我在说什么。
当然,如果您使用的是实数输入,但是对于复杂的输入来说,共轭是有意义的,请使用'。例如,如果要为实向量定义点积,则使用'可能是合适的,因为如果将来要使用复杂的输入,则共轭转置会更有意义。
1在Matlab早期,我花了相当长的时间来追溯我的代码中的某个问题,这原来是我应该使用.'时使用'引起的。真正让我难过的是,我的教授实际上说过'意味着换位!他忘了提到共轭,因此也忘了我的错误。我吸取的教训:'不是.';教授们会告诉你明显是错误的事情:-)
- 哈哈哈!我在我的帖子中提到了您...然后看看谁决定写一个:) 1
-
@rayryeng我忍不住要回答。你知道我对此有什么强烈的感觉:-)
-
可以肯定。我现在开始采用这种做法:)
-
谢谢,是的,我也被教过',而同样的问题发生在我身上,我花了很长时间才找到它。 :)
-
@legas-我记得我第一次遇到这种轻微(但灾难性的)差异。我是在不使用任何内置函数的情况下自行实现DFT的。为了进行矢量化,这需要您计算一个复系数矩阵。要进行逆运算,只需要转置矩阵即可。我花了几个小时才弄清楚为什么它不起作用...那是因为我用'而不是.' ... d \\'哦!和Luis一样,这种经历使'和.'的概念根深蒂固,永远挂在您的头上。
-
我对Stack Overflow礼仪还还很陌生,我可以接受所有人的回答吗?否则我之所以选择这个,是因为@LuisMendo在他的个人资料中已将" Matlab的'不进行转置; .'是。"!
-
@rayryeng令人难以置信!我的'问题也正是这个问题!我在傅里叶变换中得到了奇怪的值。正变换和逆变换的作用完全相同,这没有任何意义。你有同样的问题多么有趣:-)
-
@legas-您只能接受1,但是当然欢迎投票给我们:)。 FWIW,路易斯的答案肯定应该是被接受的答案。他提倡并提出了比伊冯和我自己加起来还要多的观点。
-
@legas您只能接受一个答案,但是,如果您认为它们有用的话,可以随意投票(您需要最少的代表)。顺便说一句,如果我没记错的话,我一遍又一遍地看到关于' vs .'的言论后,@ Divakar的建议就是我个人资料中的内容模糊:-)
-
我的建议肯定得到了回报;)那么,您现在有2-3个很好的问题,并且在"此哲学"后面有很多人,因此您不再孤单了! :)顺便说一句,你们对这些答案和在评论中进行的精彩讨论获得了我的好评。
我非常有偏见的观点:我使用'的大多数情况都是纯粹的"形式",也与数学计算无关。我最有可能要将索引序列1:10之类的向量旋转90度。
由于模棱两可,我很少使用'进行矩阵运算-您要回答的第一个问题是为什么要进行转置?
如果矩阵最初是在错误的方向上定义的,我宁愿以正确的方向定义矩阵,但事后不要将其旋转。
为转置矩阵进行数学计算,我明确使用transpose和ctranspose。因为这样做可以使代码更易于阅读(不必专注于那些细小的点)和调试(不必关心丢失的点)。照常执行以下工作,例如点积。
-
非常好放。我同意这一点。 1个
-
除了在某些地方我会发现有时您会正确定义一个矩阵,在其上使用内置函数而该内置函数会神秘地转置它之外,我在这里大体上与您相同。我已经开始在代码中添加诸如vectorOut = reshape(vectorOut,size(vectorIn));之类的语句,以强制执行一致的矩阵形状。
-
@rayryeng我也学会了模棱两可,并努力地避免了模棱两可。但幸运的是,我花了很短的时间学会在命名变量和选择函数时谨慎行事(实际上是在输入代码之前!)。
-
我也同意,我当然想使我的代码尽可能清晰。 '太着迷于我已经使用和发现的学习资料,现在我正在为第一年的工程师/科学家编写资料,我觉得我需要保持纪录! :)
-
@legas如果添加带有复数的示例是否有帮助?
-
@Yvon-每当我参加MATLAB研讨会时,这就是我一直强调的要点之一,所以是的,例子总是很好的。一个额外的好处是向他们展示使用'计算复杂矢量的幅度平方。
这实际上是许多MATLAB程序员之间争论的话题。有人说,如果您知道自己在做什么,那么可以继续使用',如果您知道数据是真实的,则使用.',如果数据很复杂。但是,有些人(例如Luis Mendo)提倡这样一个事实,即您始终应该始终使用.',以免引起混淆。
这样可以正确处理对函数的输入,以防您为这些函数输入的期望数据确实很复杂。有时需要复杂的转置,例如计算复杂矢量的大小平方。实际上,Loren Shure在她的MATLAB摘要之一(我不记得是哪一个...)中指出,这就是引入复杂转置的原因之一。
我的建议是,如果目标是转置数据,则应始终使用.'。如果要执行一些复杂的算术运算,请根据正在执行的运算/计算使用'和.'。显然,路易斯·门多(Luis Mendo)的良好作法使我丧心病。
-
对于初学者来说,在Matlab的第一天就很难区分'和.'了。但是一旦引入了真正的问题,应该由老师来向学生强调差异(可怜的路易斯:(
这里有两种情况可以区分:
出于非数学原因进行转置,例如您有一个将数据视为数组而不是数学矢量的函数,并且需要进行纠错输入才能以期望的格式获取它。
将转置作为数学运算。
在后一种情况下,情况必须指示哪种是正确的,并且在这种情况下,可能只有两种选择中的一种是正确的。最常见的是采用与'对应的共轭转置,但是在某些情况下,您必须进行直接转置,然后当然需要使用.'。
在前一种情况下,建议不要使用任何转置运算符。相反,您应该使用reshape或只是坚持要正确进行输入,否则请抛出错误。这清楚地将这些"计算机科学"实例与真正的数学实例区分开。
-
对于任意矩阵,我认为您无法使用reshape实现转置行为(可以用于矢量)