矩阵运算未正确返回

matrix operation not returning correctly

R = [cos(pi/3) sin(pi/3); -sin(pi/3) cos(pi/3)]
[i,j]=round([1 1] * R)

returns

i =

  -0   1

error: element number 2 undefined in return list

虽然我想要 i=0j=1

有没有办法解决这个问题?还是 Octave 太蠢了?

八度不傻;只是您希望语法 [a,b] = [c,d] 产生 'destructuring',但这不是 octave/matlab 的工作方式。相反,您将 'single' 输出(矩阵)分配给两个变量。由于您没有生成多个输出,因此没有输出分配给您指定的第二个变量(即 j),因此将被忽略。

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

[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]不是普通矩阵;它表示您希望为其分配 return 值的变量列表。如果您有一个 return 多个输出的函数或操作,那么每个输出将依次分配给每个变量。

但是,如果您只传递一个输出,并且指定了多个 return 变量,Octave 会将那个输出分配给第一个 return 变量,并忽略其余的。由于矩阵是单个对象,因此它会将 this 分配给 i,并忽略 j.

将整个内容转换为单元格后,您可以通过 {:} 对其进行索引,其中 return 将所有单元格作为逗号分隔列表(这可用于将多个参数传递给函数, 例如)。如果你只是索引而不捕获,你可以看到这个 - 这导致 'two' 个答案,一个接一个地打印:

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, 3], [2,8])  % returns 2D indices
% r = 2   2

如果解构按照您在普通矩阵上假设的方式工作,则无法知道是在尝试以“双输出”模式调用函数,还是只是尝试以“单输出”模式调用它模式,然后解构输出。