Matlab 将索引向量转换为矩阵

Matlab 将索引向量转换为矩阵,matlab,Matlab,我想把一个索引向量转换成一个矩阵,在索引的列中有一个 x = [2;1;3;1]; m = someFunc(x,3) % m = % % 0 1 0 % 1 0 0 % 0 0 1 % 1 0 0 一种方法是使用SUB2IND函数: colN = 3; assert(max(x)<=colN,'Not enough columns') %# check that you have enough columns %# other check

我想把一个索引向量转换成一个矩阵,在索引的列中有一个

x = [2;1;3;1];
m = someFunc(x,3)
% m =
%
%   0   1   0
%   1   0   0
%   0   0   1
%   1   0   0

一种方法是使用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;
colN=3;

assert(max(x)我有一个非常类似的问题,所以我不想打开一个新的问题。我想将索引的行向量转换成一个矩阵,其中的行(而不是列)在索引的行中。我可以使用前面的答案并将其反转,但我认为对于非常大的矩阵,这会表现得更好

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)

我测试了sub2ind函数,但在coursera机器学习论坛上,我被指出了这个优点

m = eye(num_cols)(x,:);
它使用恒等矩阵根据x中的值选择适当的列。

您可以使用它,这非常简单,如下所示:

accumarray([ (1:length(x))', x ], 1, [4, 3])

1:length(x)
部分指定了一个元素进入哪一行,以及
x
进入哪一列。

可能的重复我不理解这个游戏的语法。尝试使用一个小的标识矩阵,首先运行单个值,而不是向量x。例如
eye(4)(3,:)
这将获取身份矩阵的第三行。然后尝试使用向量
眼睛(4)([2,3,1],:)
。这将获取身份矩阵的第二、第三和第一行。