我在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]'
我知道我可以通过
获得v2v2 = A*v1
但我特别关注生成置换矩阵以转换为行主要表示。
如果有人可以帮助我生成这个排列矩阵,那真的会有所帮助。提前谢谢!
答案 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
很复杂,将失败。要进行转置,请使用.'
代替'
。