Sch*_*ges 4 matlab transformation matrix
我有一个上三角矩阵(没有对角线)给出:
M = [0 3 2 2 0 0; 0 0 8 6 3 2; 0 0 0 3 2 1; 0 0 0 0 2 1; 0 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)
生成的矩阵应如下所示:
R = [0 0 0 0 0 0; 0 2 0 0 0 0; 2 3 1 0 0 0; 2 6 2 1 0 0; 3 8 3 2 0 0]
Run Code Online (Sandbox Code Playgroud)
由于我找不到描述我的目标的简单解释,我试图用图像将其可视化:

我已经尝试过很多不同的组合rot90,transpose,flipud等,但我便无法找到合适的转型,让我的矩阵R
编辑:
矩阵的行M并不总是如上例所示那样排序.对于另一个矩阵M_2:
M_2 = [0 2 3 1 0 0; 0 0 3 6 3 9; 0 0 0 1 2 4; 0 0 0 0 2 6; 0 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)
生成的矩阵R_2需要如下:
R_2 = [0 0 0 0 0 0; 0 9 0 0 0 0; 1 3 4 0 0 0; 3 6 2 6 0 0; 2 3 1 2 0 0]
Run Code Online (Sandbox Code Playgroud)
再次下面的可视化:

编辑: 受@ Dan评论提示的启发,可以进一步简化为
R = reshape(rot90(M), size(M));
Run Code Online (Sandbox Code Playgroud)
原答案:
这应该是一种简单的方法
F = rot90(M);
R = F(reshape(1:numel(M), size(M)))
Run Code Online (Sandbox Code Playgroud)
返回
R =
0 0 0 0 0 0
0 2 0 0 0 0
2 3 1 0 0 0
2 6 2 1 0 0
3 8 3 2 0 0
Run Code Online (Sandbox Code Playgroud)
这个想法是,当你旋转矩阵时,你会得到
>> F = rot90(M)
F =
0 2 1 1 0
0 3 2 2 0
2 6 3 0 0
2 8 0 0 0
3 0 0 0 0
0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
这是一个6乘5的矩阵.如果考虑F上的线性索引,则相应的索引是
>> reshape(1:30, size(F))
1 7 13 19 25
2 8 14 20 26
3 9 15 21 27
4 10 16 22 28
5 11 17 23 29
6 12 18 24 30
Run Code Online (Sandbox Code Playgroud)
其中元素6,11,12,16,17,18和...现在为零,如果你将其重塑为5乘6矩阵,你得到
>> reshape(1:30, size(M))
1 6 11 16 21 26
2 7 12 17 22 27
3 8 13 18 23 28
4 9 14 19 24 29
5 10 15 20 25 30
Run Code Online (Sandbox Code Playgroud)
现在那些与零值相对应的元素位于顶部,正是我们想要的.因此,通过传递此索引数组,F我们得到所需的R.