Matlab中列主表示到行主表示的置换矩阵
我在Matlab中有一个2D数组需要转换为1D,Matlab使用列主表示法进行转换。但是,我想使用双随机矩阵将表示转换为行主 例如,我有以下二维阵列:Matlab中列主表示到行主表示的置换矩阵,matlab,matrix,permutation,row-major-order,column-major-order,Matlab,Matrix,Permutation,Row Major Order,Column Major Order,我在Matlab中有一个2D数组需要转换为1D,Matlab使用列主表示法进行转换。但是,我想使用双随机矩阵将表示转换为行主 例如,我有以下二维阵列: M = [1,2,3;4,5,6] 如果我使用“重塑”在1D中表示它 v1 = reshape(M,size(M,1)*size(M,2),1) 我得到一个列主要代表: v1 = [1,4,2,5,3,6] v2 = [1,2,3,4,5,6]' 但是,我想使用如下排列矩阵: A = [1,0,0,0,0,0; 0,0,1,0,0
M = [1,2,3;4,5,6]
如果我使用“重塑”在1D中表示它
v1 = reshape(M,size(M,1)*size(M,2),1)
我得到一个列主要代表:
v1 = [1,4,2,5,3,6]
v2 = [1,2,3,4,5,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];
因此,我得到以下行的主要表示形式:
v1 = [1,4,2,5,3,6]
v2 = [1,2,3,4,5,6]'
通过做
v2 = A*v1
我知道只要做一件事就可以得到v2
v2 = reshape(M',size(M,1)*size(M,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')
您可以使用以下命令:
M = [1 2 3; 4 5 6];
ind = reshape(1:numel(M), size(M,1), []).';
A = accumarray([(1:numel(M)).' ind(:)], 1);
还要注意,您的代码
v2=重塑(M',尺寸(M,1)*尺寸(M,2),1)
如果
M
复杂,则将失败。要进行转置,请使用“
而不是”
我不知道您为什么需要这个置换矩阵。这比简单地排列矩阵效率要低得多。如果你能解释为什么你对它很挑剔,也许会更容易得到帮助。我很难帮助人们走错方向顺便说一句,您的语句可以写成remove(M,size(M,1)*size(M,2),1)
或M(:)
。谢谢。我正在实现一篇论文,它使用排列矩阵来改变表示形式。因为它涉及到使用矩阵的优化步骤,所以构建矩阵并使用它是最简单的。比我的版本要短一些。美好的