2017-12-12 5 views
2

3x3x3 어레이로 가정하면 조건이 충족 될 경우 dim3 전체를 어떻게 바꾸겠습니까? 이 간단한 경우에서 주어진 배열matlab 어레이의 dim3 바꾸기

A = [1 2 3; 4 1 6; 7 8 1]; 
A(:, :, 2) = [1 2 3; 4 2 6; 7 8 2] 
A(:, :, 3) = [1 2 3; 4 3 6; 7 8 3] 

파크 A(2,2,:)A(3,3,:)[1 2 3]를 포함하는 두 dim3s있다. 어떻게하면 그들을 [10 10 10]으로 대체 할 수 있습니까? 이것은 매우 간단 해 보이지만 그저 내 머리를 잡지 못합니다 ...

편집 : 나는 probelym을 지나치게 단순화 시켰습니다. replacemnt Vector는 [11 12 13]과 같아야합니다 (-X) 실제 문제.

I가 A(2,2,:) 대체 깨끗한 메모리 효율적인 방법을 찾고

과 함께 A(3,3,:) [11 12 13] 수득 출력 : A (:, : 1)이 경우 =

 1  2  3 
    4 11  6 
    7  8 11 


A(:,:,2) = 

    1  2  3 
    4 12  6 
    7  8 12 


A(:,:,3) = 

    1  2  3 
    4 13  6 
    7  8 13 

Curcial 실제 세계 문제에서 얼마나 많은 emements가 대체 될지 모른다는 것입니다 ...

+0

을 교체는'단지 A (2,2, :) = 10;'A (3,3, :) = 10;'당신은 또한 그 조건이 존재하는지 어떻게 찾는가? –

+0

나는 당신이 원하는 것을 이해하지 못합니다. 입력 및 원하는 출력은 무엇입니까 (귀하의 예에서)? –

답변

1

그냥 몇 가지 논리적 색인 (나중에 매트랩 2016b과) : matlab에 대한

target = [1 2 3]; % the vector you want to find 
replacement = [11 12 13]; % the vector you want to replace it with 

% find the 2d indexes where the target is found 
idx = all(A == permute(target,[1 3 2]),3); 
% replace found indexes with replacement vector 
A(logical(idx.*ones(1,1,size(A,3)))) = repelem(replacement,1,nnz(idx)); 

같은 것은 2016b 사전 :

idx = all(bsxfun(@eq,A,permute(target,[1 3 2])),3); 
A(logical(bsxfun(@times,idx,ones(1,1,size(A,3))))) = repelem(replacement,1,nnz(idx)); 
+0

대단히 고마워! 흥미롭게도 루프를 사용하는 verison보다 빠르지는 않습니다. 적어도 '2769x2694x3 uint8'의 경우 – mhwh

0

3 차원을 따라 요소를 바꾸는 것은 단지 과제 일뿐입니다.

A(2,2,:) = 10; 
A(:,:,1) = 
    1  2  3 
    4 10  6 
    7  8  1  
A(:,:,2) = 
    1  2  3 
    4 10  6 
    7  8  2 
A(:,:,3) = 
    1  2  3 
    4 10  6 
    7  8  3 

당신이 세 번째 차원에 따라 1,2,3 패턴이 곳 식별하려고하는 경우는 다음과 같이 할 수있다 :

idx= A(:,:,1) == 1 & A(:,:,2) ==2 & A(:,:,3) == 3; 
idx= repmat(idx,1,1,3); 
A(idx) = 10; 

결과 :

A(:,:,1) = 
    1  2  3 
    4 10  6 
    7  8 10 
A(:,:,2) = 
    1  2  3 
    4 10  6 
    7  8 10 
A(:,:,3) = 
    1  2  3 
    4 10  6 
    7  8 10 
+0

건배 그게 분명 도움이된다. 나는 [10 10 10]을 대체하여 내 질문에 실수를 저질렀다고 생각한다. 나는 단순한 인덱스가 작동하지 않도록 [10 11 12]와 같은 벡터를 넣기를 희망한다. 이 경우 ... – mhwh

0

나는 'Aero Engy의 이전 글을 기반으로 한 해결책을 찾았습니다.하지만 그것은 루프에서 asignments가 필요하기 때문에 매우 못 생깁니다 - 누군가가 벡터화 된 버전에 대한 아이디어를 가지고 있습니까?

A = [1 2 3; 4 1 6; 7 8 1]; 
A(:, :, 2) = [1 2 3; 4 2 6; 7 8 2]; 
A(:, :, 3) = [1 2 3; 4 3 6; 7 8 3]; 

Target = [1 2 3]; 
Replacement = [11 12 13]; 

idx = find(A(:,:,1) == Target(1) & A(:,:,2) == Target(2) & A(:,:,3) == Target(3)); 
[x, y, ~] = ind2sub(size(A), idx); 

for i = 1:length(x) 
A(x(i), y(i), 1) = Replacement(1); 
A(x(i), y(i), 2) = Replacement(2); 
A(x(i), y(i), 3) = Replacement(3); 
end