3

LMatlab で、 index の 1 を除いて、length の 0-vector を作成したいとしますi

たとえば、次のようなものです。

>> mostlyzeros(6, 3)

ans =

     0     0     1     0     0     0

目的は、要素ごとに別のベクトルを乗算する「選択」ベクトルとして使用できるようにすることです。

4

6 に答える 6

11

私が考えることができる最も簡単な方法はこれです:

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 に代入することで最も簡単に実行できます。これは、行列またはベクトルを拡張する場合にも役立ちます)。

于 2013-03-17T23:39:49.857 に答える
2

楽しみのために、別のワンライナー:

function [out] = mostlyzeros(idx, L)
out([L, idx]) = [0 1];
于 2013-03-18T08:11:02.047 に答える
2

私は次のことよりも賢明なことを考えるのに苦労しています:

Vec = zeros(1, L);
Vec(i) = 1;

しかし、私は間違っていることが証明されてうれしいです!

更新: @GlenO が提供するワンライナー ソリューションは非常に優れています。ただし、効率が主な基準である場合、私のマシンでのいくつかの速度テストでは、この回答で提案された単純な方法と他の2つの回答が3倍または4倍高速であることが示されていることに注意してください...

次の更新:ああ!それが「選択ベクトル」の意味です。@GlenO は、この操作で 1 と 0 のベクトルが慣用的な Matlab ではない理由を説明していますが、それを構築することを選択します。

psi実際にはmatlab 関数であるため、添字として使用することは避けてください。

于 2013-03-17T23:08:39.517 に答える
1

高速である必要があるもう1つの1行オプションは次のとおりです。

vec = sparse(1, ii, 1, 1, L);

于 2013-03-18T13:30:29.637 に答える
1

私は考えることができます:

function mostlyones(m,n)

mat=zeros(1,m);
mat(n)=1;

また、注意点が一つ。MATLAB では、インデックスは 0 からではなく 1 から始まります。したがって、関数呼び出しはmostlyzeros(6,3)

于 2013-03-17T23:08:49.447 に答える
1

単純にゼロ ベクトルを作成し、好きな値を 1 に変更します。

function zeroWithOne(int numOfZeros, int pos)
a = zeros(numOfZeros,1);
a(pos) = 1;
于 2013-03-17T23:09:59.703 に答える