2012-12-11 11 views
7

Trong Matlab 2012b, có một chức năng changem cho phép bạn thay thế các yếu tố của một ma trận với các giá trị khác được quy định bởi một tập hợp các phím: Substitute values in data arrayphiên bản vectorized Elegant của CHANGEM (giá trị thay thế) - MATLAB

Có một cách thanh lịch/vectorized để làm như vậy nếu tôi không có hộp công cụ Lập bản đồ?

+1

Bạn đã xem [chủ đề này] (http: //www.mathworks .com/matlabcentral/newsreader/view_thread/264957)? –

+0

Thực hiện một cách vectorized để giải quyết vấn đề này [ở đây] (http://stackoverflow.com/a/28263828/3293881)! – Divakar

Trả lời

11

Có, sử dụng ismember:

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

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

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

Tôi không biết changem, và tôi nghi ngờ trên sẽ không bao gồm đầy đủ chức năng của nó (tại sao khác sẽ TMW đã giới thiệu changem ?), nhưng tốt, nó làm những gì bạn yêu cầu :)

+1

Điều này thực sự thông minh. Cảm ơn rất nhiều. – ezbentley

1

Thật không may, tôi nghĩ bạn cần vòng lặp FOR. Nhưng nó khá đơn giản:

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

Xem câu trả lời hay hơn của Rody ở trên với ismember – Pete

6

Thực hiện Vectorized CHANGEM với bsxfun, max

Đôi khi trở lại, tôi đã được thực hiện để viết một tùy chỉnhvector hóa phiên bản của changem thực hiện với bsxfunmax như là một phần của một vấn đề lớn hơn nhiều. Có thể tìm thấy giải pháp được tham chiếu here. Sau đó, sau vài liên kết tôi thấy bài đăng này và nghĩ rằng nó có thể được đăng ở đây như là một giải pháp để tìm kiếm dễ dàng giữa các độc giả trong tương lai cũng bởi vì vấn đề này chỉ yêu cầu một phiên bản hiệu quả và vectơ của changem. Vì vậy, đây là mã chức năng -

%// 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; 

Cú pháp được sử dụng trong các phiên bản tùy chỉnh theo cú pháp tương tự như trong changem.m -

function B = changem(A, newval, oldval) 
%CHANGEM Substitute values in data array ... 
Các vấn đề liên quan