在 MATLAB 中索引矩阵的所有对角线

use*_*216 2 indexing matlab matrix

我正在尝试在 matlab 中索引(而不是获取)矩阵的对角线。

假设我有一个矩阵“M”,即 n × n。然后我想获得矩阵“M”中所有可能对角线的所有因数。

我知道中心对角线的索引为

M(1:(n+1):end)
Run Code Online (Sandbox Code Playgroud)

其上方的所有以下对角线索引为:

M((1+1*n):(n+1):end)
M((1+2*n):(n+1):end)...
M((1+n*n):(n+1):end)
Run Code Online (Sandbox Code Playgroud)

现在我还想得到下面的对角线。然而,我一生都无法弄清楚如何去做。

可重现的例子:

rng(1); % set seed
n = 4;
M = rand(n);
Run Code Online (Sandbox Code Playgroud)

屈服

M =

   0.562408   0.947364   0.655088   0.181702
   0.960604   0.268834   0.469042   0.089167
   0.578719   0.657845   0.516215   0.419000
   0.226410   0.601666   0.169212   0.378740
Run Code Online (Sandbox Code Playgroud)

我想索引下对角线,例如下对角线:

0.960604 0.657845 0.169212
Run Code Online (Sandbox Code Playgroud)

也就是说,我不需要通过例如 diags 函数获取对角线,而是访问索引(因为我最终想用对角线替换矩阵条目对角线)。

hba*_*rts 5

正如您已经注意到的,您可以使用该diag函数来获取主对角线以及主对角线上方或下方的其他对角线,

M = magic(4)    % Test data
M =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

diag(M, -1)
ans =
     5
     7
    15
Run Code Online (Sandbox Code Playgroud)

但您不能使用以下diag函数将值分配给对角线:

diag(M, -1) = [3; 2; 1]
Index in position 2 is invalid. Array indices must be positive integers or logical values.
Run Code Online (Sandbox Code Playgroud)

相反,我们可以通过使用相同大小的逻辑矩阵对数组进行索引来使用逻辑索引。M我们可以使用该diag函数轻松创建此矩阵,方法是创建一个在指定对角线上包含 1 的对角矩阵:

diag(ones(1, 3), -1)
ans =
     0     0     0     0
     1     0     0     0
     0     1     0     0
     0     0     1     0
Run Code Online (Sandbox Code Playgroud)

要使用该矩阵进行逻辑索引,我们需要使用该函数将其从双logical精度转换为逻辑矩阵。

M(logical(diag(ones(1, 3), -1)))
ans =
     5
     7
    15
Run Code Online (Sandbox Code Playgroud)

或为其分配新值

M(logical(diag(ones(1, 3), -1))) = [99, 98, 97]
M =
    16     2     3    13
    99    11    10     8
     9    98     6    12
     4    14    97     1
Run Code Online (Sandbox Code Playgroud)