Matlab 2012bにはchangem
、行列の要素を一連のキーで指定された他の値に置き換えることができる関数があります。
データ配列の値を置き換える
マッピングツールボックスがない場合、同じことを行うためのエレガントな/ベクトル化された方法はありますか?
Matlab 2012bにはchangem
、行列の要素を一連のキーで指定された他の値に置き換えることができる関数があります。
データ配列の値を置き換える
マッピングツールボックスがない場合、同じことを行うためのエレガントな/ベクトル化された方法はありますか?
はい、使用しますismember
:
A = magic(3);
oldCode = [ 8 9];
newCode = [12 13];
[a,b] = ismember(A,oldCode);
A(a) = newCode(b(a));
私は知りませんchangem
、そして私は上記がその機能を完全にカバーしていないと思います(なぜTMWが導入したのchangem
でしょうか?)、しかしまあ、それはあなたが尋ねたことをします:)
CHANGEM
withのベクトル化された実装bsxfun
、max
しばらく前に、私は、はるかに大きな問題の一部として、実装されたのカスタマイズされた ベクトル化バージョンを作成するようになりました。参照されているソリューションはここにあります。次に、いくつかのリンクをたどると、この投稿を見て、将来の読者が簡単に見つけられるようにするための解決策としてここに投稿できると思いました。この問題は、の効率的でベクトル化されたバージョンのみを要求するためです。だから、ここに関数コードがあります-changem
bsxfun
max
changem
%// 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;
changem.m
カスタムバージョンで使用される構文は、 -と同じ構文に従います。
function B = changem(A, newval, oldval)
%CHANGEM Substitute values in data array ...
残念ながら、FORループが必要だと思います。しかし、それは非常に簡単です。
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