Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更好的方法来实现这个MATLAB代码?_Matlab_Vectorization - Fatal编程技术网

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

有没有更好的方法来实现这个MATLAB代码?,matlab,vectorization,Matlab,Vectorization,Y=0(5000,10) y是一个5000 x 1的预定义向量,由1到10的数字组成 for i= 1:size(Y,1) Y(i,y(i)) = 1; end 有没有更好更简单的方法来实现这一点,因为我的其余代码是矢量化的,并且不包含任何for循环您可以使用bsxfun: bsxfun(@eq,y,[1:10]) 您可以使用y(i)=[1:10]来创建每一行,而不是使用您的代码,该行最终被包装在bsxfun中进行矢量化 另一个想法是指数计算: Y((y-1).*5000+(1:50

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

for i= 1:size(Y,1)
    Y(i,y(i)) = 1;
end
有没有更好更简单的方法来实现这一点,因为我的其余代码是矢量化的,并且不包含任何for循环

您可以使用bsxfun:

bsxfun(@eq,y,[1:10])
您可以使用
y(i)=[1:10]
来创建每一行,而不是使用您的代码,该行最终被包装在bsxfun中进行矢量化

另一个想法是指数计算:

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

您可以使用
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.

还有另一种方法:使用
y
作为列索引创建矩阵,然后根据需要转换为:

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

这段代码可能相当快,因为你在里面做的事情真的很小。但是,返回的矩阵似乎是逻辑的,即使您使用
zero()预先分配它。可能需要进行
double()
转换。在我的系统上,这比
for
循环的
慢得多。。。(有转换)对我来说,
bsxfun()
,包括
double()
转换,花费的时间是
for
循环的一半(0.002190s vs 0.005001s)