如何解决矩阵运算没有正确返回
R = [cos(pi/3) sin(pi/3); -sin(pi/3) cos(pi/3)]
[i,j]=round([1 1] * R)
返回
i =
-0 1
error: element number 2 undefined in return list
虽然我想要 i=0
和 j=1
有没有办法解决这个问题?或者只是 Octave 是愚蠢的?
解决方法
Octave 并不愚蠢;只是您希望语法 [a,b] = [c,d]
导致“解构”,但这不是八度/matlab 的工作方式。相反,您将“单个”输出(矩阵)分配给两个变量。由于您没有生成多个输出,因此没有要分配给您指定的第二个变量(即 j
)的输出,因此将其忽略。
长话短说,如果您追求“解构”效果,您可以将矩阵转换为单元格,然后执行单元格扩展以生成两个输出:
[i,j] = num2cell( round( [1 1] * R ) ){:}
或者,显然,您可以将输出收集到单个对象中,然后通过该对象分别分配给 i
和 j
:
[IJ] = round( [1 1] * R ) )
i = IJ(1)
j = IJ(2)
但大概这就是你想要避免的。
说明:
[a,b] = bla bla
不起作用的原因是因为从语法上讲,这里的 [a,b]
不是一个普通矩阵;它表示您希望为其分配返回值的变量列表。如果您有一个返回多个输出的函数或操作,那么每个输出将依次分配给这些变量中的每一个。
然而,如果你只传递一个输出,并且你指定了多个返回变量,Octave 会将该单个输出分配给第一个返回变量,而忽略其余的。并且由于矩阵是单个对象,因此它将其分配给 i
,并忽略 j
。
将整个内容转换为一个单元格允许您通过 {:}
对其进行索引,它将所有单元格作为逗号分隔列表返回(例如,这可用于将多个参数传递给函数)。如果您只是索引而不捕获,您可以看到这一点 - 这会导致“两个”答案,一个接一个打印:
num2cell( round( [1 1] * R ) ){:}
% ans = 0
% ans = 1
请注意,matlab/octave 中的许多函数的行为会有所不同,具体取决于您是使用 1 还是 2 个输出参数调用它们。换句话说,请考虑调用函数时使用的输出参数的数量作为其签名的一部分!例如,看看 ind2sub
函数:
[r] = ind2sub([3,3],[2,8]) % returns 1D indices
% r = 2 8
[r,~] = ind2sub([3,8]) % returns 2D indices
% r = 2 2
如果解构按照您在普通矩阵上假设的方式工作,则无法知道是在“双输出”模式下尝试调用函数,还是只是尝试在“单输出”模式下调用它,并且然后解构输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。