有没有更好的方法来实现这个MATLAB代码?

时间:2016-02-22 21:47:50

标签: matlab vectorization

Y = zeros(5000,10); y是一个5000 x 1预定义向量,由1到10之间的数字组成;

for i= 1:size(Y,1)
    Y(i,y(i)) = 1;
end

是否有更好更简单的方法来实现它,因为我的其余代码是矢量化的,并且不包含任何for循环

3 个答案:

答案 0 :(得分:6)

您可以使用bsxfun:

bsxfun(@eq,y,[1:10])

您可以使用y(i)==[1:10]创建每一行,而不是代码,最后用bsxfun包装到vectorize。

另一个想法是指数计算:

Y((y-1).*5000+(1:5000).')=1;

答案 1 :(得分:2)

您可以使用sub2ind

Y(sub2ind(size(Y), 1:size(Y, 1), y')) = 1;

然而,实际上这可能会稍微慢一些:

Y = zeros(5000,10);
y = randi(10, 5000, 1);

tic
for jj = 1:1000
    for i = 1:size(Y,1)
        Y(i,y(i)) = 1;
    end
end
toc
% Elapsed time is 0.126774 seconds.

tic
for jj = 1:1000
    Y(sub2ind(size(Y), 1:size(Y, 1), y')) = 1;
end
toc
% Elapsed time is 0.139531 seconds.

% @Daniel's solution
tic
for jj = 1:1000
    Y = double(bsxfun(@eq, y, 1:10));
end
toc
%Elapsed time is 0.187331 seconds.

答案 2 :(得分:2)

以下是另一种方法:使用y作为列索引创建sparse矩阵,然后根据需要转换为full

Y = full(sparse(1:numel(y), y, 1, numel(y), 10));