n サイズのベクトルがあり、これを nxm のブール行列に変換したいと考えています。ここで、m はそのベクトル内の一意の値の数です。
a = repmat(1:5:20,1,3)
a =
1 6 11 16 1 6 11 16 1 6 11 16
私が望む結果は、行列12x4です:
1 0 0 0
0 1 0 0
0 0 1 0
...
0 0 0 1
forループなしでそれを行う方法はありますか?
n サイズのベクトルがあり、これを nxm のブール行列に変換したいと考えています。ここで、m はそのベクトル内の一意の値の数です。
a = repmat(1:5:20,1,3)
a =
1 6 11 16 1 6 11 16 1 6 11 16
私が望む結果は、行列12x4です:
1 0 0 0
0 1 0 0
0 0 1 0
...
0 0 0 1
forループなしでそれを行う方法はありますか?
これを試すことができます:
a = repmat(1:5:20,1,3);
b = unique(a);
bsxfun(@eq, a', b)
結果は次のようになります。
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
a = repmat(1:5:20,1,3)
b=unique(a);
c = repmat(a',1,numel(b))== repmat(b,numel(a),1);
しかし、一般的にループはより速くなります、repmatは避けられるべきです。だから、今ループで:
a = repmat(1:5:20,1,3)
b=unique(a);
c=false(numel(a),numel(b));
for ii=1:numel(a)
c(ii,:) = a(ii)==b;
end