【问题标题】:Elegant vectorized version of CHANGEM (substitute values) - MATLABCHANGEM 的优雅矢量化版本(替代值) - MATLAB
【发布时间】:2012-12-11 02:24:46
【问题描述】:

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

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

【问题讨论】:

  • 你看到this thread了吗?
  • 实现了一个矢量化的方式来解决这个问题here!

标签: arrays matlab matrix vectorization


【解决方案1】:

是的,使用ismember

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

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

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

我不知道changem,而且我怀疑以上内容不会完全涵盖它的功能(为什么TMW 会引入changem?),但是,它可以满足您的要求:)

【讨论】:

  • 这真是太聪明了。非常感谢。
【解决方案2】:

CHANGEMbsxfunmax 的矢量化实现

前段时间,我被要求编写一个自定义 矢量化版本的changem,使用bsxfunmax 实现,这是一个更大问题的一部分。可以在here 找到引用的解决方案。然后,通过几个链接,我看到了这篇文章,并认为它可以作为一个解决方案发布在这里,以便未来的读者轻松找到,因为这个问题专门要求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 ... 

【讨论】:

    【解决方案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
    

    【讨论】:

    • 使用 ismember 查看以上 Rody 的更好答案
    猜你喜欢
    • 2013-05-01
    • 2016-12-08
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2016-02-11
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多