优雅的矢量化版本的CHANGEM(替代值) - MATLAB

时间:2012-12-11 02:24:47

标签: arrays matlab matrix vectorization

在Matlab 2012b中,有一个changem函数,允许您用一组键指定的其他值替换矩阵的元素: Substitute values in data array

如果我没有Mapping工具箱,是否有一种优雅/矢量化的方法来做同样的事情?

3 个答案:

答案 0 :(得分:10)

是的,请使用ismember

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

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

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

我不知道changem,我怀疑上面的内容不会完全覆盖它的功能(为什么TMW会引入changem?),但是,它会做你所问的:)

答案 1 :(得分:6)

CHANGEM bsxfunmax

changem的矢量化实施

有些时候,我被编写了一个自定义 矢量化版本的changem,其中bsxfunmax作为一部分实现了一个更大的问题。可以找到引用的解决方案here。然后,通过以下几个链接,我看到了这篇文章,并认为它可以作为一个解决方案在这里发布,以便在未来的读者中轻松找到,因为这个问题只是要求{em>高效和矢量化版本的{{1 }}。所以,这是功能代码 -

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

答案 2 :(得分:1)

不幸的是,我认为你需要一个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