L
Matlab で、 index の 1 を除いて、length の 0-vector を作成したいとしますi
。
たとえば、次のようなものです。
>> mostlyzeros(6, 3)
ans =
0 0 1 0 0 0
目的は、要素ごとに別のベクトルを乗算する「選択」ベクトルとして使用できるようにすることです。
私が考えることができる最も簡単な方法はこれです:
a = (1:N)==m;
ここで、N>=m です。そうは言っても、結果のベクトルを「選択ベクトル」として使用する場合、2 つのベクトルを要素ごとに乗算する理由はわかりません。比較的遅く、非効率的であると予想されるからです。m 番目の位置にあるベクトル v の m 番目の値のみを含むベクトルを取得する場合、これはより簡単な方法です。
b = ((1:N)==m)*v(m);
最も自然な方法はこれでなければなりませんが:
b(N)=0;
b(m)=v(m);
これより前に b が定義されていないと仮定します (b が定義されている場合は、N 番目の値をゼロとして割り当てるのではなく、ゼロを使用する必要があります。それ以前には存在しなかったゼロ ベクトルまたは行列を作成するのは私の経験です)。最後の要素を 0 に代入することで最も簡単に実行できます。これは、行列またはベクトルを拡張する場合にも役立ちます)。
楽しみのために、別のワンライナー:
function [out] = mostlyzeros(idx, L)
out([L, idx]) = [0 1];
私は次のことよりも賢明なことを考えるのに苦労しています:
Vec = zeros(1, L);
Vec(i) = 1;
しかし、私は間違っていることが証明されてうれしいです!
更新: @GlenO が提供するワンライナー ソリューションは非常に優れています。ただし、効率が主な基準である場合、私のマシンでのいくつかの速度テストでは、この回答で提案された単純な方法と他の2つの回答が3倍または4倍高速であることが示されていることに注意してください...
次の更新:ああ!それが「選択ベクトル」の意味です。@GlenO は、この操作で 1 と 0 のベクトルが慣用的な Matlab ではない理由を説明していますが、それを構築することを選択します。
psi
実際にはmatlab 関数であるため、添字として使用することは避けてください。
高速である必要があるもう1つの1行オプションは次のとおりです。
vec = sparse(1, ii, 1, 1, L);
私は考えることができます:
function mostlyones(m,n)
mat=zeros(1,m);
mat(n)=1;
また、注意点が一つ。MATLAB では、インデックスは 0 からではなく 1 から始まります。したがって、関数呼び出しはmostlyzeros(6,3)
単純にゼロ ベクトルを作成し、好きな値を 1 に変更します。
function zeroWithOne(int numOfZeros, int pos)
a = zeros(numOfZeros,1);
a(pos) = 1;