11

私はマトリックスを持っています:

x = [0 0 0 1 1 0 5 0 7 0];

次のように、すべてのゼロを削除する必要があります。

x = [1 1 5 7];

私が使用している行列は大きく (1x15000)、これを複数回 (5000+) 行う必要があるため、効率が重要です!

4

6 に答える 6

16

一方通行:

x(x == 0) = [];

タイミングに関する注意:

woodchipsで言及されているように、このメソッドはKitsuneYMGで使用されるメソッドと比較して遅いようです。これは、 MathWorks のブログ投稿の 1 つで Loren によって指摘されています。これを何千回も行う必要があると述べたので、違いに気付くかもしれません。その場合、x = x(x~=0);最初に試してみます。

警告:非整数を使用している場合は注意してください。たとえば、ゼロに十分近いと見なして削除する非常に小さい数値がある場合、上記のコードはそれを削除しません。正確なゼロのみが削除されます。以下は、ゼロに「十分に近い」数値も削除するのに役立ちます。

tolerance = 0.0001;  % Choose a threshold for "close enough to zero"
x(abs(x) <= tolerance) = [];
于 2009-04-10T18:26:30.830 に答える
11

これらは、3 つの一般的なソリューションです。違いを見るのに役立ちます。

x = round(rand(1,15000));

y = x;

tic,y(y==0) = [];toc

Elapsed time is 0.004398 seconds.

y = x;

tic,y = y(y~=0);toc

Elapsed time is 0.001759 seconds.

y = x;

tic,y = y(find(y));toc

Elapsed time is 0.003579 seconds.

ご覧のとおり、最も安価な方法は、保持する要素を選択する直接論理インデックスです。matlab はこれらの要素を検索し、それらのリストを返し、ベクトルにインデックスを付けるため、検索はよりコストがかかります。

于 2009-04-10T21:03:10.640 に答える
11

ただ違うように:

x=x(x~=0);

また

x=x(abs(x)>threshold);

これには、複素数にも取り組むというボーナスがあります

于 2009-04-10T18:36:58.857 に答える
3

ここに別の方法があります

y = x(検索(x))

あなたが試したさまざまなアプローチの相対的な効率性を理解するのはあなたに任せます.書いて私たち全員に知らせてください.

于 2009-04-10T18:37:35.297 に答える
2

私のタイミングの結果は、それが大幅に高速であるかどうかを決定するものではありませんが、これが最速かつ最も簡単なアプローチのようです:

y = nonzeros(y) 
于 2013-07-23T11:48:07.303 に答える
0
x = [0 0 0 1 1 0 5 0 7 0]
y = [0 2 0 1 1 2 5 2 7 0]

x2 と y2 は次のように取得できます。

x2=x(~(x==0 & y==0))
y2=y(~(x==0 & y==0))

x2 = [0     1     1     0     5     0     7]
y2 = [2     1     1     2     5     2     7]

お役に立てれば!

于 2012-08-09T03:01:58.537 に答える