1

我在 Matlab 中有一个二维数组需要转换为一维,而 Matlab 使用列主要表示进行转换。但是,我想使用双重随机矩阵将表示形式转换为行专业。

例如,我有以下二维数组:

M = [1,2,3;4,5,6]

如果我使用 reshape 在一维中表示它

v1 = reshape(M,size(M,1)*size(M,2),1)

我得到一个专栏主要代表:

v1 = [1,4,2,5,3,6]

但是,我想使用这样的置换矩阵:

A = [1,0,0,0,0,0;
    0,0,1,0,0,0;
    0,0,0,0,1,0;
    0,1,0,0,0,0;
    0,0,0,1,0,0;
    0,0,0,0,0,1];

这样我得到以下行主要表示:

v2 = [1,2,3,4,5,6]'

通过做

v2 = A*v1

我知道我可以通过这样做来获得 v2

v2 = reshape(M',size(M,1)*size(M,2),1)

但我特别关注生成置换矩阵以转换为行主要表示。

如果有人可以帮助我生成这个排列矩阵,那真的很有帮助。提前致谢!

4

2 回答 2

1

您可以A使用线性索引创建矩阵。矩阵中的元素可以使用一个索引进行索引,然后按列对它们进行寻址,其顺序与将矩阵重新整形为向量时出现的顺序相同。

您需要在每个奇数列中设置一个元素,其中该元素比上一列低一个:

n = numel(M);
A = zeros(n,n);
A(1:2*n+1:end) = 1;

并且以类似的方式在每个偶数列中也有一个:

A(n+n/2+1:2*n+1:end) = 1;

这适用于所有M有两行的矩阵。对于具有m行的矩阵:

[m,k] = size(M);
n = numel(M); % == m*k
index = 1:m*n+1:n*n;
offset = 0:n+k:m*n;
index = index + offset'; % requires newer MATLAB
A = zeros(n,n);
A(index(:)) = 1;

如果需要较新版本 MATLAB 的行给您一个错误,请替换为bsxfun(@plus,index,offset').

于 2018-01-28T03:19:11.540 回答
1

您可以使用以下内容:

M = [1 2 3; 4 5 6];
ind = reshape(1:numel(M), size(M,1), []).';
A = accumarray([(1:numel(M)).' ind(:)], 1);

另请注意,您的代码

v2 = reshape(M',size(M,1)*size(M,2),1)

M如果是复杂的将失败。要转置,请使用.'而不是'.

于 2018-01-28T03:28:20.590 回答