と仮定すると:
はここで生産するあなたのコードのベクトル化フォームのゼロから始まりますあなたのオリジナルと同じ結果:
function C = version_a()
source_data = rand(10,20)<.8;
G = rand(10,15)<.9;
intersum = zeros(1, size(source_data,2));
z = 1;
i = 1;
while i <= 15
for j=1:10
if(G(j,i)==1)
intersum(z+1,:)=xor(intersum(z,:), source_data(j,:));
z=z+1;
end
end
C(i,:)=intersum(z,:);
i=i+1;
end
ret = C;
end
function C = version_b()
source_data = rand(10,20)<.8; % Can initialize in a single call
G = rand(10,15)<.9; % Same here
C = zeros(size(G,2),size(source_data,2));
C(1,:) = mod(sum(source_data(G(:,1),:)),2);
for i = 2:15
C(i,:) = mod(C(i-1,:) + sum(source_data(G(:,i),:)),2);
end
end
両方のバージョンのタイミングを確認するには、私は、このテスト機能を使用:
function ret = xor_test()
ret = 0;
seed = 123456789;
laps = 10000;
tic
for i = 1:laps
RandStream.getDefaultStream.reset(seed);
a = version_a();
end
toc
tic
for i = 1:laps
RandStream.getDefaultStream.reset(seed);
b = version_b();
end
toc
ret = ret + sum(sum(b ~= a));
end
をそして私は私のマシン上で次のタイミングだ:私はそれを変更する理由に今
Elapsed time is 13.537738 seconds.
Elapsed time is 2.302747 seconds.
ans =
0
をそうですね...
xor
logical
の配列上での操作はかなりchecですキングの総額(true
の値を1として扱う)。 Furhtermore intersum
はアキュムレータとして使用されていますので、値は最終的にC
になります。そのため、すべてを省略します。 G(j,i)
が1である行を取ることはlogical indexingによって行うことができます。
最後に、この提案されたバージョンが気に入らなくても、あなたのC
とintersum
ベクターを事前に割り当てることをお勧めします。それは過去に私にとって大きな違いをもたらしました。
最後のループで 'i'とは何があり、' K'とは何ですか? 'xor'自体は既にベクトル化されています。おそらくそれはあなたのために役立ちます:http://www.mathworks.de/help/techdoc/ref/xor.htmlそうでなければ' arrayfun'を見てください – tim
@Alexandrewこれを指摘してくれてありがとう上記の質問を編集して – bhavs