将矩阵转换为沿其对角线的矢量

时间:2010-08-09 13:50:40

标签: algorithm matlab matrix transform

我不是程序员,我只需要在matlab中以数字方式解决问题。 我需要一个函数来对任何方阵进行以下转换:

row 1: 1 2 3 
row 2: 4 5 6
row 3: 7 8 9

1 4 2 7 5 3 8 6 9

即将矩阵从左到右沿着对角线写入矢量。 有什么想法吗?


我真的需要更多的帮助:

假设我们已经转换为向量的矩阵具有由M(i,j)表示的条目,其中i是行和j列。现在我需要能够从向量中的位置找出矩阵中的原始位置,即如果它在向量中的第3个条目,我需要一个能给我i = 1 j = 2的函数。有什么想法吗?我真的坚持这个:(谢谢

5 个答案:

答案 0 :(得分:6)

这非常类似于以曲折顺序遍历矩阵的previous question。稍作修改,我们得到:

A = rand(3);                        %# input matrix

ind = reshape(1:numel(A), size(A)); %# indices of elements
ind = spdiags(fliplr(ind));         %# get the anti-diagonals
ind = ind(end:-1:1);                %# reverse order
ind = ind(ind~=0);                  %# keep non-zero indices
B = A(ind);                         %# get elements in desired order

使用SPDIAGS功能。这样做的好处是它适用于任意矩阵大小(不仅仅是方形矩阵)。例如:

A =
      0.75127      0.69908      0.54722      0.25751
       0.2551       0.8909      0.13862      0.84072
      0.50596      0.95929      0.14929      0.25428
B =
  Columns 1 through 6
      0.75127       0.2551      0.69908      0.50596       0.8909      0.54722
  Columns 7 through 12
      0.95929      0.13862      0.25751      0.14929      0.84072      0.25428

答案 1 :(得分:3)

这是实现此目的的一种方法。

%# n is the number of rows (or cols) of the square array
n = 3;
array = [1 2 3;4 5 6;7 8 9]; %# this is the array we'll reorder

%# create list of indices that allow us
%# to read the array in the proper order
hh = hankel(1:n,n:(2*n-1)); %# creates a matrix with numbered antidiagonals
[dummy,sortIdx] = sort(hh(:)); %# sortIdx contains the new order

%# reorder the array
array(sortIdx)

ans =
     1     4     2     7     5     3     8     6     9

答案 2 :(得分:2)

您可以使用函数HANKEL将矩阵转换为向量,以在矩阵中生成索引。以下是Jonas' answer的缩短版本,使用M作为上面给出的示例矩阵:

N = size(M,1);
A = hankel(1:N,N:(2*N-1));
[junk,sortIndex] = sort(A(:));

现在,您可以使用sortIndex将矩阵M更改为向量vec,如下所示:

vec = M(sortIndex);

如果您希望将行和列索引(rIndexcIndex)放入与vec中的值对应的原始矩阵中,则可以使用函数{{ 3}}:

[rIndex,cIndex] = ind2sub(N,sortIndex);

答案 3 :(得分:1)

A=[1,2,3;4,5,6;7,8,9];
d = size(A,1);
X=[];
for n = 1:2*size(A,1) - 1
    j = min(n,d); i = (n+1)-(j);
    X = cat(2,X,diag(flipud(A(i:j,i:j)))');
end

X
X =
     1     4     2     7     5     3     8     6     9

答案 4 :(得分:1)

您可以通过以下方式生成对角线:

for i = -2:2
    diag(flipud(a), i)
end

我不知道这是否是连接对角线的最佳方式:

d = []
for i = -2:2
    d = vertcat(d, diag(flipud(a), i))
end

(我用八度音程测试,而不是用matlab测试)