置换矩阵在Matlab中将表格从列主要更改为行主要

时间:2018-01-28 00:49:18

标签: matlab matrix permutation row-major-order column-major-order

我在Matlab中有一个需要转换为1D的2D数组,而Matlab使用列主要表示进行转换。但是,我想使用双随机矩阵将表示转换为行主。

例如,我有以下2D数组:

#include <fstream>
#include <sstream>
#include <string>
#include <vector>

int main()
{
    std::ifstream infile("input.txt");
    if (infile.is_open())
    {
        std::string line;
        std::getline(infile, line);  // skip first line

        std::vector<float> productA;
        std::vector<float> productB;
        std::vector<float> productC;

        while (std::getline(infile, line))
        {
            float temp;
            std::stringstream ss(line);

            ss >> temp; // column A
            productA.push_back(temp);

            ss >> temp; // column B
            productB.push_back(temp);

            ss >> temp; // column C
            productC.push_back(temp);
        }
        // your product vectors are now populated and you can
        // do whatever you need with the column data here
    }
    return 0;
}

如果我使用reshape在1D中表示它

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

我得到一个专栏代表:

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
v2 = A*v1

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

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

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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很复杂,

将失败。要进行转置,请使用.'代替'