在 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