我不确定如何表达这个问题,但我认为一个例子会有所帮助。假设我有一个向量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有数千个元素,这种方法会更有效吗?)
谢谢!
答案 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))