在Matlab中用两个值替换索引

时间:2015-05-12 01:07:07

标签: matlab for-loop indexing

我正在尝试在Matlab中解决以下问题:

  

函数replace_me的定义如下:function w = replace_me(v,a,b,c)。第一个输入参数v是一个向量,而abc都是标量。该函数用va替换b的每个元素等于c

     

例如,命令

x = replace_me([1 2 3],2,4,5);
     

使x等于[1 4 5 3]。如果省略c,则会将a的出现替换为b的两个副本。如果b也被省略,它会用两个零替换每个a。“

这是我到目前为止所做的:

function [result] = replace_me(v,a,b,c)
    result = v;
    for ii = 1:length(v)
        if result(ii) == a
            result(ii) = b;
            result(ii +1) = c;
        end
    end
end

该函数将v中与a相同的值替换为b,但我无法用a替换b }和c。任何帮助将非常感激。

编辑:

我已更新了我的代码:

function [v] = replace_me(v,a,b,c)
for ii = 1:length(v)
  if v(ii) == a
    v = horzcat(v(1:ii-1), [b c], v(ii+1:end));
    fprintf('%d',v);
  elseif v(ii) == a && length(varargin) == 3
    v = horzcat(v(1:ii-1), [b b], v(ii+1:end));
    fprintf('%d',v);
  elseif v(ii) == a && length(varargin) == 2
    v = horzcat(v(1:ii-1), [0 0], v(ii+1:end));
    fprintf('%d',v);
  else

      fprintf('%d',v);
  end

end
end

当我尝试replace_me([1 2 3 4 5 6 7 8 9 10],2,2)时收到以下错误:

  
    

replace_me([1 2 3 4 5 6 7 8 9 10],2,2)         12345678910         使用replace_me时出错(第4行)         没有足够的输入参数。

  

3 个答案:

答案 0 :(得分:2)

通过计算av出现的次数,您可以计算结果向量length(v) + sum(v == a)的大小,然后您可以迭代向量并插入[b c]每次找到匹配项。每次插入新元素时,您应该将计数器ii增加2,否则如果a=b,您将使用a填充向量的剩余部分。它不是一种有效的算法,但它与您的实现类似

result = v;
rep = sum(result == a);

if rep == 0
  return
end

for ii = 1:(length(result) + rep)
  if result(ii) == a
    result = [result(1:ii-1), [b c], result(ii+1:end)];
    ii = ii + 2;
  end
end

一个有效的替代方案(没有矢量大小调整)可能是:

rep = sum(v == a);

if rep == 0
    result = v;
    return;
end

result = zeros(1, length(v) + rep);

idx = 1;
for ii = 1:length(v)
    if v(ii) == a
       result(idx) = b;
       result(idx+1) = c;
       idx = idx + 2;
    else 
       result(idx) = a;
       idx = idx + 1;
    end
end

答案 1 :(得分:2)

以下是另一种选择:(原来{@ 3}}来自@A。Donda)

这具有替换多次出现

的优点
function [result] = replace_me(v,a,b,c)
    if nargin == 3
        c = b;
    end
    if nargin == 2
        c = 0;
        b = 0;
    end
    result = v;
    equ = result == a;
    result = num2cell(result);
    result(equ) = {[b c]};
    result = [result{:}];
end

<强>结果:

>> x = replace_me([1 2 3],2,4,5)

x =

 1     4     5     3

>> x = replace_me([1 2 3],2)

x =

 1     0     0     3

>> x = replace_me([1 2 3],2,4)

x =

 1     4     4     3

>> x = replace_me([1 2 3 2], 2, 4, 5)

x =

 1     4     5     3     4     5

答案 2 :(得分:1)

可以是这样的:

function result = replace_me(v, a, b, c)
  result = [];
  for ii = 1:length(v)
    if v(ii) == a
      result = [result, b, c];
    else
      result = [result, v(ii)];
    end
  end
end

关于错误&#34;使用replace_me时出错(第4行)没有足够的输入参数。&#34;,这只是因为你用4个输入参数编写了函数,而你只用3调用。