微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

矩阵运算没有正确返回

如何解决矩阵运算没有正确返回

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=0j=1

有没有办法解决这个问题?或者只是 Octave 是愚蠢的?

解决方法

Octave 并不愚蠢;只是您希望语法 [a,b] = [c,d] 导致“解构”,但这不是八度/matlab 的工作方式。相反,您将“单个”输出(矩阵)分配给两个变量。由于您没有生成多个输出,因此没有要分配给您指定的第二个变量(即 j)的输出,因此将其忽略。

长话短说,如果您追求“解构”效果,您可以将矩阵转换为单元格,然后执行单元格扩展以生成两个输出:

[i,j] = num2cell( round( [1 1] * R ) ){:}

或者,显然,您可以将输出收集到单个对象中,然后通过该对象分别分配给 ij

[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 举报,一经查实,本站将立刻删除。