500セル(50行10列)のMATLABでマトリックスを作成したいのですが、ランダムな2進数でマトリックスを作成して初期化するにはどうすればよいですか?サンプル3*4として50*10スケールでこのようなものが欲しい
0 1 1 1
0 0 0 0
1 1 1 1
その後、どの行の10進方程式を取得できますか?行1のように10進数で7に等しい
500セル(50行10列)のMATLABでマトリックスを作成したいのですが、ランダムな2進数でマトリックスを作成して初期化するにはどうすればよいですか?サンプル3*4として50*10スケールでこのようなものが欲しい
0 1 1 1
0 0 0 0
1 1 1 1
その後、どの行の10進方程式を取得できますか?行1のように10進数で7に等しい
randi
ランダムな整数を生成するために使用してみませんか?
A = randi([0 1], 50, 10);
前の回答のように、2進行を数値に変換します。
bin2dec(num2str(A(n,:)))
これを試して:
A = rand(50, 10) > 0.5;
3番目の行に相当する10進数は、次のn
式で与えられます。
bin2dec(num2str(A(n,:)))
または、必要に応じて、
sum( A(n,:) .* 2.^(size(A,2)-1:-1:0) ) % for big endian
sum( A(n,:) .* 2.^(0:size(A,2)-1) ) % for little endian
これは。より数倍高速ですbin2dec
。
別のオプション:
A=round(rand(50,10));
n番目の行の10進式は次の式で与えられます。
bin2dec(num2str(A(n,:)))
他のアンスウェアはより短いので、32ビットまたは64ビットの乱数を生成して31または63を破棄するのは魅力的ではないことがわかります...そして、次のようなものを使用します。
A_dec=randi([0,2^10-1],50,1,'uint16');
そして、ビットを取得するには:
A_bin=bsxfun(@(a,i)logical(bitget(a,i)),A_dec,10:-1:1);
これは、より大きなアレイ(R2014a、i7 930)の場合も数倍高速です[ただし、OPにとっては重要ではないようです]:
チック; for i = 1:1000; n = randi([0,2 ^ 10-1]、50000,1、'uint16'); 終了;toc
Elapsed time is 1.341566 seconds.
チック; for i = 1:1000; n = bsxfun(@(n、i)logical(bitget(n、i))、randi([0,2 ^ 10-1]、50000,1、'uint16')、10: -1:1); 終了;toc
Elapsed time is 2.547187 seconds.
チック; i = 1:1000の場合; n = rand(50000,10)> 0.5; 終了;toc
Elapsed time is 8.030767 seconds.
チック; for i = 1:1000; n = sum(bsxfun(@ times、rand(50000,10)> 0.5,2。^(0:9))、2); 終了;toc
Elapsed time is 13.062462 seconds.
binornd
さらに遅い:
チック; for i = 1:1000; n = logic(binornd(ones(50000,10)、0.5)); 終了;toc
Elapsed time is 47.657960 seconds.
MATLABが論理を保存する方法のため、これはまだ最適ではないことに注意してください。(ビットはバイトとして保存されます...)
または、次のように試すことができます。
A = binornd(ones(50,10),p);
このようにして、発生の確率を制御するオプションもあります。