Matlab将连续的零值替换为其他值

时间:2016-10-31 02:28:56

标签: matlab matrix

我有这个矩阵:

A = [92    92    92    91    91    91   146   146   146     0
      0     0   112   112   112   127   127   127    35    35
     16    16   121   121   121    55    55    55   148   148
      0     0     0    96    96     0     0     0     0     0
      0    16    16    16   140   140   140     0     0     0]

如何用矩阵B中的混洗连续值替换连续的零值

B = [3 3 3 5 5 6 6 2 2 2 7 7 7]

需要的结果,像这样的矩阵:

A = [92    92    92    91    91    91   146   146   146    0
      6     6   112   112   112   127   127   127    35   35
     16    16   121   121   121    55    55    55   148  148
      7     7     7    96    96     5     5     3     3    3
      0    16    16    16   140   140   140     2     2    2]
非常感谢你......

2 个答案:

答案 0 :(得分:1)

你可以这样做:

[M,N]=size(A);

for i=1:M
  for j=1:N
    if A(i,j)==0
        A(i,j)=B(i+j);
    end
  end
end

答案 1 :(得分:0)

如果我从您所描述的内容中正确理解,您的解决方案将需要以下步骤:

  • 循环遍历矩阵的行,例如for row = 1:size(A, 1)
  • 遍历每行的元素,识别每个零运行的开始位置并存储索引和运行的长度。例如,您最终可能会得到一个矩阵,如:consecutiveZeroes = [ 2 1 2 ; 4 1 3 ; 4 6 5 ; 5 8 3 ]表示您在长度为2的(2,1)处运行,在长度为3的(4,1)处运行,运行于(4, 6)长度为5,长度为3的(5,8),
  • 现在循环遍历B的元素,计算每个值的元素数量。例如,您可以将其存储为replacementValues = [ 3 3 ; 2 5 ; 2 6 ; 3 2 ; 3 7 ],意思是三个3,两个5,两个6等。
  • 现在从您的consecutiveZeroes矩阵中取一行并随机选择一行replacementValues,指定相同数量的元素,将A中的零替换为{{1}中的值并删除replacementValues中的行,以表明您已使用过它。
  • 如果replacementValues中没有一行描述足够长的值来替换您的一个零游程,请找到replacementValues中可以使用的两行或更多行的组合

你不能只用一次通过矩阵就可以做到这一点,因为你可能有一个像replacementValues这样的矩阵A和一个像[ 15 7 0 0 0 0 0 0 3 ; 2 0 0 0 5 0 0 0 9 ]这样的向量B,你只能在那里实现你的目标想要使用四个5和两个7并且不是三个2和三个3来代替六个零的运行,因为你必须在下一行中留下2和3的两个三个零的运行。如果效率不是很关键,那么最简单的方法可能是尝试不同的随机组合多次运行算法,直到你得到一个有效的方法 - 但是如果输入数据确实存在,你需要决定在放弃之前尝试多少次没有解决方案。

如果您遇到任何这些步骤,我建议您提出一个更具体的新问题。