如何将向量转换为矩阵,其中列的值为1,其中列号为向量元素,否则为0?

时间:2016-10-20 10:47:18

标签: matlab matrix vector

我不确定如何表达这个问题,但我认为一个例子会有所帮助。假设我有一个向量y = [3; 1; 4; 1; 6]。我想创建矩阵Y =

[0     0     1     0     0     0;
 1     0     0     0     0     0;
 0     0     0     1     0     0;
 1     0     0     0     0     0;
 0     0     0     0     0     1]

 ↑     ↑     ↑     ↑     ↑     ↑
 1     2     3     4     5     6

其中每列上的元素是一个或零,对应于向量中的值。

我发现我可以使用

来做到这一点
Y = []; for k = 1:max(y); Y = [Y (y==k)]; end

我可以在没有for循环的情况下完成吗(如果y有数千个元素,这种方法会更有效吗?)

谢谢!

4 个答案:

答案 0 :(得分:3)

您的方法效率不高,因为您在not a good programming practice的循环中增加了Y的大小。以下是修复代码的方法:

Ele = numel(y); 
Y= zeros(Ele, max(y));
for k = 1:Ele
    Y (k,y(k))= 1;
end

这是一种没有循环的替代方法:

Ele = numel(y);          %Finding no. of elements in y
Y= zeros(Ele, max(y));   % Initiailizing the matrix of the required size with all zeros
lin_idx = sub2ind(size(Y), 1:Ele, y.'); % Finding linear indexes
Y(lin_idx)=1             % Storing 1 in those indexes

答案 1 :(得分:2)

您可以使用bsxfun

result = double(bsxfun(@eq, y(:), 1:max(y)));

如果您在Matlab版本R2016b或更高版本上运行代码,则可以将语法简化为

result = double(y(:)==(1:max(y)));

另一种可能更有效的方法是使用accumarray直接填写值:

result = accumarray([(1:numel(y)).' y(:)], 1);

答案 2 :(得分:1)

我找到了另一个解决方案:

Scanner input = new Scanner(System.in);
ahmed ahmedobject = new ahmed();
System.out.println("Type your name here");
String name = input.nextLine();
ahmedobject.function(name);

答案 3 :(得分:0)

另一种解决方案:

Y = repmat(1:max(y), size(y)) == repmat(y, 1, max(y))