矩阵运算未正确返回
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=0
和 j=1
有没有办法解决这个问题?还是 Octave 太蠢了?
八度不傻;只是您希望语法 [a,b] = [c,d]
产生 'destructuring',但这不是 octave/matlab 的工作方式。相反,您将 'single' 输出(矩阵)分配给两个变量。由于您没有生成多个输出,因此没有输出分配给您指定的第二个变量(即 j
),因此将被忽略。
长话短说,如果您追求'destructuring'效果,您可以将矩阵转换为单元格,然后执行单元格扩展以生成两个输出:
[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]
不是普通矩阵;它表示您希望为其分配 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
如果解构按照您在普通矩阵上假设的方式工作,则无法知道是在尝试以“双输出”模式调用函数,还是只是尝试以“单输出”模式调用它模式,然后解构输出。
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=0
和 j=1
有没有办法解决这个问题?还是 Octave 太蠢了?
八度不傻;只是您希望语法 [a,b] = [c,d]
产生 'destructuring',但这不是 octave/matlab 的工作方式。相反,您将 'single' 输出(矩阵)分配给两个变量。由于您没有生成多个输出,因此没有输出分配给您指定的第二个变量(即 j
),因此将被忽略。
长话短说,如果您追求'destructuring'效果,您可以将矩阵转换为单元格,然后执行单元格扩展以生成两个输出:
[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]
不是普通矩阵;它表示您希望为其分配 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
如果解构按照您在普通矩阵上假设的方式工作,则无法知道是在尝试以“双输出”模式调用函数,还是只是尝试以“单输出”模式调用它模式,然后解构输出。