CHANGEM(替代值)的优雅矢量版本 - MATLAB(Elegant vectorized v

2019-08-03 20:34发布

在Matlab 2012B,有一个changem功能,可以代替由一组键的指定其他值的矩阵的元素: 在数据阵列的替代值

有一种优雅/矢量化的方式做同样的,如果我没有映射工具箱?

Answer 1:

是的,使用ismember

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

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

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

我不知道changem ,我怀疑上述不完全覆盖其功能性(否则为什么TMW纷纷推出changem ?),但远,但它确实你问:)



Answer 2:

量化执行CHANGEMbsxfunmax

有时回来,我是为了写一个定制版本的矢量 changem与实施bsxfunmax的一个更大的问题的一部分。 引用的解决方案可以找到这里 。 然后,以下几个环节我看到了这个帖子,并认为这可能被张贴在这里作为未来读者也因为这个问题专门询问的高效和矢量版本之间容易找到解决的办法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 ... 


Answer 3:

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


文章来源: Elegant vectorized version of CHANGEM (substitute values) - MATLAB