将索引向量转换为矩阵

6
我想将索引向量转换为矩阵,其中索引所在的列中有1。
x = [2;1;3;1];
m = someFunc(x,3)
% m =
%
%   0   1   0
%   1   0   0
%   0   0   1
%   1   0   0

可能是重复的问题:如何更改矩阵中多个点的值? - gnovice
4个回答

15

我测试了sub2ind函数,但在coursera机器学习论坛上,有人向我推荐了这个神器。

m = eye(num_cols)(x,:);

它使用恒等矩阵根据x中的值选择适当的列。


我不理解这个的语法。 - Dan
玩一下吧。尝试使用小的单位矩阵,首先运行单个值而不是向量x。例如eye(4)(3,:),这将获取单位矩阵的第三行。然后尝试使用向量eye(4)([2,3,1], :)。这将获取单位矩阵的第二、第三和第一行。 - Hans Then

3

一种方法是使用SUB2IND函数:

colN = 3;
assert(max(x)<=colN,'Not enough columns') %# check that you have enough columns
%# other checks that x is valid indices

m = zeros(numel(x),colN);
m(sub2ind(size(m),1:numel(x),x')) = 1;

1
我有一个非常类似的问题,所以我不想开一个新的。我想把一个索引的行向量转换成一个矩阵,其中索引的行(而不是列)中有1。我本可以使用之前的答案并将其反转,但我认为这样在处理非常大的矩阵时会更有效率。
octave> x = [2 1 3 1];
octave> m = setRowsToOne(x, 3)
m =

   0   1   0   1
   1   0   0   0
   0   0   1   0

我不知道如何使用sub2ind来完成这个任务,所以我自己计算了。

function matrixResult = setRowsToOne(indexOfRows, minimumNumberOfRows)
   numRows = max([indexOfRows minimumNumberOfRows]);
   numCols = columns(indexOfRows);
   matrixResult = zeros(numRows, numCols);
   assert(indexOfRows > 0, 'Indices must be positive.');
   matrixResult(([0:numCols-1]) * numRows + indexOfRows) = 1;
end

x = [2 1 3 1];
m = setRowsToOne(x, 3)

0
你可以使用accumarray,这使得这个过程非常简单,像这样:
accumarray([ (1:length(x))', x ], 1, [4, 3])

1:length(x) 部分指定了 1 的位置所在的行,x 指定了它们所在的列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接