2012-12-11 17 views
7

w Matlab 2012b, jest changem funkcja, która pozwala na zastępowanie elementów matrycy z innych wartości określonej przez zbiór klawiszy: Substitute values in data arrayElegancki vectorized wersja CHANGEM (wartości zastępcze) - MATLAB

Czy istnieje elegancki/wektoryzowany sposób zrobić to samo, jeśli nie mam przybornika mapowania?

+1

widziałaś [Wątek] (http: //www.mathworks .com/matlabcentral/newsreader/view_thread/264957)? –

+0

Zaimplementowałem wektorowy sposób rozwiązania tego problemu [tutaj] (http://stackoverflow.com/a/28263828/3293881)! – Divakar

Odpowiedz

11

Tak, użyj ismember:

A  = magic(3); 
oldCode = [ 8 9]; 
newCode = [12 13]; 

[a,b] = ismember(A,oldCode); 

A(a) = newCode(b(a)); 

nie wiem changem, i podejrzewam, że powyższe nie będzie w pełni pokryć jego funkcjonalność (dlaczego indziej TMW wprowadziły changem ?), ale dobrze, że robi to, co pytasz :)

+1

To jest naprawdę sprytne. Wielkie dzięki. – ezbentley

1

Niestety, myślę, że potrzebujesz pętli FOR. Ale to jest całkiem prosta:

function xNew = myChangeM(x,oldCode,newCode) 
% xNew = myChangeM(x,oldCode,newCode) 
% 
% x is a matrix of vaues 
% oldCode and newCode specify the values to replace and with what 
% e.g., 
% x = round(randn(10)); 
% oldCode = [-1 -2]; 
% newCode = [nan, 10]; %replace -1 with nan, -2 by 10 
% xNew = myChangeM(x,oldCode,newCode) 

xNew = x; 
for repInd = 1:numel(oldCode) 
    xNew(x == oldCode(repInd)) = newCode(repInd); 
end 
+0

Zobacz lepszą odpowiedź Rody powyżej z ismember – Pete

6

wektorowy realizację CHANGEM z bsxfun, max

Jakiś czas wstecz, powstał napisać dostosowanywektorowy wersję changem realizowany z bsxfun i max jako część znacznie większego problemu. Odniesione rozwiązanie można znaleźć pod adresem here. Następnie, po kilku odsyłaczach zobaczyłem ten post i pomyślałem, że może on zostać opublikowany tutaj jako rozwiązanie dla łatwego znalezienia wśród przyszłych czytelników, jak również dlatego, że ten problem wymaga jedynie wydajnej i wektoryzowanej wersji changem. Tak więc, oto kod funkcji -

%// CHANGEM_VECTORIZED Vectorized version of CHANGEM with MAX, BSXFUN 
function B = changem_vectorized(A,newval,oldval) 

B = A; 
[valid,id] = max(bsxfun(@eq,A(:),oldval(:).'),[],2); %//' 
B(valid) = newval(id(valid)); 

return; 

Składnia używana w wersji niestandardowej ma taką samą składnię jak w changem.m -

function B = changem(A, newval, oldval) 
%CHANGEM Substitute values in data array ... 
Powiązane problemy