2

3 つのマトリックス 500x500 要素で構成される 3D マトリックスがあります。ここで、3 番目の行列を取得して、たとえば 100 より大きいすべての値を 0 に置き換えたいと思います。行列 a がある場合、コードは次のようになります。

a(a>100)=0

ただし、私の場合、3D マトリックスの 3 番目のマトリックス (:,:,3) を取得する必要があります。同じコードを使用しようとすると、次のようになります。

a(:,:,3)(a(:,:,3)>100)=0

「()-indexing must appear last appear in a index expression.」というメッセージが表示されます。

それをどのように表現できるかについて何か考えはありますか?

4

3 に答える 3

4

どうですか

 a(:,:,3) = (a(:,:,3)<100).*a(:,:,3);

于 2012-11-23T15:15:10.357 に答える
3

別の選択肢を追加するだけです:

A(cat(3, false(size(A,1),size(A,2),2), A(:,:,3)>100)) = 0;

または、次のように 3D でインデックス変数を割り当てることができます。

id(:,:,3) = A(:,:,3)>100;
A(id) = 0;

これは、はるかにクリーンな構文を持っています。

次に、いくつかの速度テストを行います。

clc, clear all

b = 250*rand(500,500, 3);

% Me 1
tic
for ii = 1:1e2
    A=b;
    clear id
    id = cat(3, false(size(A,1),size(A,2),2), A(:,:,3)>100);
    A(id) = 0;
end
toc

% Acorbe
tic
for ii = 1:1e2
    A=b;
    A(:,:,3) = (A(:,:,3)<100).*A(:,:,3);
end
toc

% angainor 1
tic
for ii = 1:1e2
    A=b;
    clear id
    id = find(A(:,:,3)>100) + 2*size(A, 1)*size(A, 2);
    A(id)=0;
end
toc

% Me 2
tic
for ii = 1:1e2
    A=b;
    clear id
    id(:,:,3) = A(:,:,3)>100;
    A(id) = 0;
end
toc

% angainor 2
tic
for ii = 1:1e2
    A=b;
    clear id
    AA = reshape(A, [], 3);
    AA(AA(:,3)>100,3) = 0;
    A = reshape(AA, size(A,1), size(A,2), 3);
end
toc

結果:

Elapsed time is 1.612787 seconds. % me #1
Elapsed time is 1.223496 seconds. % Acorbe
Elapsed time is 1.606858 seconds. % angainor #1
Elapsed time is 1.510153 seconds. % me #2
Elapsed time is 0.964423 seconds. % angainor #2

勝者はangainorのようです:)

于 2012-11-23T15:32:27.240 に答える
3

そのために線形インデックスを使用できます。

id = find(A(:,:,3)>100)+2*size(A, 1)*size(A, 2);
A(id)=0

または、 2D にreshape配列して、次のこともできます。A

AA = reshape(A, 500*500, 3);
AA(AA(:,3)>100,3) = 0;
A = reshape(AA, 500, 500,3);

Acorbe の元のコードを使用しますが、3D とは対照的に 2D マトリックスで機能します :)

于 2012-11-23T15:18:28.987 に答える