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



在 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 的矢量化实现与 bsxfunmax

不久前,我被要求编写一个定制的矢量化版本,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 ... 

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

最新更新