【问题标题】:Matlab replace consecutive zero value with others valueMatlab用其他值替换连续的零值
【发布时间】:2019-12-06 01:25:11
【问题描述】:

我有这个矩阵:

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]

【问题讨论】:

  • 你能解释一下你所说的来自 B 的“洗牌的连续值”是什么意思吗?在您的示例中,您似乎随机选择了 B 中出现的值,然后“用完”B 中具有该值的所有元素来替换 A 中特定的零运行。但是替换值的运行是否必须如果可能,匹配零运行的长度?例如,结果的第四行可以是5 5 3 96 96 3 3 7 7 7吗?
  • 否,B 中相同编号的替换值必须是连续的。你能给我一个解决方案吗?谢谢@nekomatic,如果不是所有来自B的值都可以分发就可以了

标签: matlab matrix


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

【讨论】:

  • 我试过了,代码结果:尝试访问 B(14);索引超出范围,因为 numel(B)=13
  • 这只是因为您写下的序列 B 小于矩阵中的零数。尝试扩展 B 等于或大于零的数量。
  • 这会将 A 中的 all 零值替换为 B 中的值,而不仅仅是提问者想要的连续值。此外,请求是对来自 B 的值进行“洗牌”。
【解决方案2】:

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

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

你不能只通过矩阵一次就做到这一点,因为大概你可以有一个像[ 15 7 0 0 0 0 0 0 3 ; 2 0 0 0 5 0 0 0 9 ]这样的矩阵A和一个像[ 2 2 2 3 3 3 7 7 5 5 5 5 ]这样的向量B,如果你使用你只能实现你想要的四个 5 和两个 7 而不是三个 2 和三个 3 来代替六个零的运行,因为您必须将 2 和 3 留给下一行三个零的两个运行。如果效率不重要,最简单的方法可能是多次运行算法,尝试不同的随机组合,直到你得到一个有效的组合——但你需要决定在放弃之前尝试多少次,以防输入数据实际上有没有办法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多