2016-02-22 164 views
6

Y = zeros(5000,10); y是由1到10的數字組成的5000 x 1個預定義向量;有沒有更好的方法來實現這個MATLAB代碼?

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

有沒有實現這更好的和更簡單的方法,因爲我的代碼的其餘部分是矢量,並且不包含任何for循環

+2

此代碼可能是相當快的,因爲它是,因爲你正在做的裏面還真有點事情。 –

回答

6

你可以使用bsxfun:

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

代替你的代碼,你可以使用y(i)==[1:10]創建每行,最終將其封裝在bsxfun中進行矢量化。

另一個想法是指數的計算:

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

漂亮的漁獲@Daniel。然而,即使您使用'zeros()'預先分配它,返回的矩陣看起來是合乎邏輯的。可能需要'double()'轉換。 – Alessiox

+0

在我的系統上,這比'for'循環慢(對於轉換) – zeeMonkeez

+0

對我來說,'bsxfun()',包括'double()'轉換,花費的時間相對於'for'循環(0.002190s vs 0.005001s) – Alessiox

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

這裏的另一種方法:使用創建一個sparse矩陣爲列索引,並在需要時再轉換爲full

Y = full(sparse(1:numel(y), y, 1, numel(y), 10)); 
相關問題