簡體   English   中英

在MATLAB中替換3D矩陣的元素

[英]Replacing elements of a 3D matrix in MATLAB

我有一個3D矩陣,由3個矩陣500x500元素組成。 現在,我想取第三個矩陣並用0代替它所有的值,比如大於100。如果我有一個矩陣a,我的代碼就是:

a(a>100)=0

但是,在我的情況下,我需要采用我的3D矩陣的第三個矩陣,它將是(:,:,3)。 如果我現在嘗試使用相同的代碼:

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

我收到消息“() - 索引必須出現在索引表達式的最后。”

關於我如何表達的任何想法?

關於什么

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

您可以使用線性索引:

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

或者,您可以將陣列A reshape為2D並且:

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

它使用Acorbe的原始代碼,但與3D相比,適用於2D矩陣:)

只是添加另一種選擇:

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 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM