8

与えられたベクトル

A = [1,2,3,...,100]

n番目ごとを除くすべての要素を抽出したい。したがって、n=5 の場合、出力は次のようになります。

B = [1,2,3,4,6,7,8,9,11,...]

n番目の要素ごとにアクセスできることを知っています

A(5:5:end)

しかし、逆コマンドのようなものが必要です。これが存在しない場合は、要素を反復処理して n 番目のエントリごとにスキップしますが、それは汚い方法です。

4

6 に答える 6

13

次のような要素を削除できます。

A = 1:100;
removalList = 1:5:100;
A(removalList) = [];
于 2012-11-20T09:13:58.533 に答える
4

マスクを使用してください。あなたが持っているとしましょう

A = 1 : 100;

それで

m = mod(0 : length(A) - 1, 5);

Aは、繰り返されるシーケンスを含むものと同じ長さのベクトルになります0 1 2 3 4。A からのすべてが必要ですが、要素 where m == 4、つまり

B = A(m ~= 4);

結果として

B == [1 2 3 4 6 7 8 9 11 12 13 14 16 ...]
于 2012-11-20T09:11:27.467 に答える
2

または、論理インデックスを使用できます。

n = 5; % remove the fifth
idx = logical(zeroes(size(A))); % creates a blank mask
idx(n) = 1; % makes the nth element 1
A(idx) = []; % ta-da!

引用した「反転」コマンドについては、論理インデックスを使用してその動作を実現できます。ベクトルを否定して、すべての 1 を 0 に変換したり、その逆を行ったりできます。

したがって、このコードはすべて削除しますが、5 番目の要素は削除します。

negatedIdx = ~idx;
A(negatedIdx) = [];
于 2012-11-20T09:28:37.623 に答える
1

なぜこのように使用しないのですか?

A があなたのベクトルだと言う

A = 1:100
n = 5
B = A([1:n-1,n+1:end])

それから

B=[1 2 3 4 6 7 8 9 10 ...]
于 2014-02-05T08:57:23.130 に答える
0

問題の解決策の 1 つは functionsetdiff()です。

あなたの特定のケースでは、解決策は次のようになります。

lenA = length(A);
index = setdiff(1:lenA,n:n:lenA);
B = A(index)

一度にすべてを実行すると、両方の余分な変数を回避できます。

B = A( setdiff(1:end,n:n:end) )

ただし、テスト済みのように、論理インデックス作成はより高速なオプションです。

lenA = length(A);
index = true(1, lenA);
index(n:n:lenA) = false;
B = A(index)

これらのコードはすべて、変数が指定されていることを前提としておりn、別の値に適応できます。

于 2015-08-25T23:34:54.207 に答える