【发布时间】:2012-03-30 17:10:48
【问题描述】:
我想将一个索引向量转换为一个矩阵,其中索引列中包含一个。
x = [2;1;3;1];
m = someFunc(x,3)
% m =
%
% 0 1 0
% 1 0 0
% 0 0 1
% 1 0 0
【问题讨论】:
标签: matlab
我想将一个索引向量转换为一个矩阵,其中索引列中包含一个。
x = [2;1;3;1];
m = someFunc(x,3)
% m =
%
% 0 1 0
% 1 0 0
% 0 0 1
% 1 0 0
【问题讨论】:
标签: matlab
我测试了 sub2ind 函数,但是在 coursera 机器学习论坛上我被指出了这个美丽。
m = eye(num_cols)(x,:);
它使用单位矩阵根据 x 中的值选择适当的列。
【讨论】:
eye(4)(3,:) 这将占用单位矩阵的第三行。然后尝试使用矢量eye(4)([2,3,1], :)。这将获取单位矩阵的第二、第三和第一行。
一种方法是使用 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;
【讨论】:
我有一个非常相似的问题,所以我不想打开一个新问题。我想将索引的行向量转换为索引的行(而不是列)中的矩阵。我本可以使用之前的答案并将其倒置,但我认为这对于非常大的矩阵会表现得更好。
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)
【讨论】:
您可以使用accumarray,这让这很容易,就像这样:
accumarray([ (1:length(x))', x ], 1, [4, 3])
1:length(x) 部分指定这些行进入哪些行,x 进入哪些列。
【讨论】: