【问题标题】:Recognise that numbers in a row of a matrix are all the same number认识到矩阵的一行中的数字都是相同的数字
【发布时间】:2015-07-28 12:36:06
【问题描述】:

我有一个0s、1s、2s 和3s 的矩阵。如果同一行中的所有元素都相同,那么我希望它显示文本'flush' .例如,我有矩阵

[0,1,0,2,3; 
 0,0,0,0,0; 
 3,2,1,3,1; 
 2,2,2,2,2];

我将如何编程 Matlab 以识别第 2 行和第 4 行都具有相同的数字?

【问题讨论】:

  • 例如row = 2时,使用all(foo(2,1)==foo(2,:))
  • 嗯。这可能看起来很有趣,但我认为您可以使用 Matlab 的内置 Var(方差)函数。如果一行的方差为 0,那么它的所有元素都是 0。代码看起来应该很简单,类似于 out = var(X.')。并找出 out == 0 应该为您提供方差为 0 的行的索引
  • @GameOfThrows 好主意。这可能是一个错字,但如果方差为 0,那么所有元素都是相同的,不一定是 0 :)。
  • 另一种方式(基于H.Muster的解决方案)是sum(abs(diff(A')))==0

标签: matlab


【解决方案1】:

A = [0,1,0,2,3; 0,0,0,0,0; 3,2,1,3,1; 2,2,2,2,2]

如前所述,如果您只有正数,则可以使用方差。

n_flush = var(A, [], 2) == 0

但是,这对于负数会失败,例如像 [-2 -1 1 2] 这样的行。

我要做的是将第一列与其余列进行比较,并标记所有元素都相等的行。

n_flush = all(bsxfun(@eq, A(:,1), A(:,2:end)),2)

现在,如果您想在每次行相等时显示刷新,您可以这样做

for ind = find(n_flush)
   fprintf('flush row %i\n', ind)
end

【讨论】:

  • 为什么[-2 -1 1 2] 会成为方差问题?
  • 不清楚:为什么负数会有问题?
  • var 使用负数有什么问题?
【解决方案2】:

如果您需要将所有内容放在一个单行中(这是许多 Matlab 极客尝试做的事情),那么这里可能会满足您的需求

cellfun(@(x) char((x==0)*sprintf('flush')), num2cell(var(A')'), 'UniformOutput', false)

编辑:好主意 GameOfThrows

【讨论】:

    【解决方案3】:

    另一种解决方案是通过将第一列复制到匹配大小矩阵的其他列,从每列中显式减去第一列。

    identical_rows = ~any(A - kron(ones(1,size(A,2)),A(:,1)),2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多