Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中列主表示到行主表示的置换矩阵_Matlab_Matrix_Permutation_Row Major Order_Column Major Order - Fatal编程技术网

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

我在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,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(:)
。谢谢。我正在实现一篇论文,它使用排列矩阵来改变表示形式。因为它涉及到使用矩阵的优化步骤,所以构建矩阵并使用它是最简单的。比我的版本要短一些。美好的