【问题标题】:sum of continuous values in matlabmatlab中连续值的总和
【发布时间】:2015-02-06 07:33:58
【问题描述】:

我需要在matlab中计算以下内容。

编辑编辑:我总是有一个 16 x 3 矩阵。 16 行 3 列。 3 列代表 R、G、B,16 行代表点。从1-16。 一个示例矩阵如下所示:

1 1 1
-1 0 0
0 0 1
1 0 0
-1 0 0
1 0 -1
1 1 1
1 1 1
0 0 0
-1 0 1
1 0 0
0 0 1
1 0 1
0 0 0
0 0 0
1 0 1

现在我需要知道是否有 11 行连贯地具有最小值。每列中有 1 个值 ~= 0? 在上面的示例中,前 8 行和最后一行在每列中都有 min 1 值并且是连贯的。所以这 9 行是最大连贯的行,中间没有完整的零行。

抱歉,我的第一篇文章不正确。

我用一个非常糟糕的解决方案来做到这一点。有没有更快的方法(矢量化)来做到这一点?

for i=1:16
   for j=0:16
      if i+j > 16
         value = (i+j)-16;
      else
         value = i+j;
      end
      if table(value,1) ~= 0 || table(value,2) ~= 0 || table(value,3) ~= 0
         equal = equal + 1;
         if equal >= 11
            copy(y,x) = 1;
            equal = 0;
            break;
         end
         else
            equal = 0;
         end
      end
   end
end

16 个点是圆形的。这分钟第一个点和最后一个点连接。

感谢您的帮助,并为您的困惑感到抱歉。

【问题讨论】:

  • 您的编辑只是混淆了这个问题。编写一个示例矩阵,展示您的解决方案等......
  • 为什么不使用完整的最小样本数据。您使用了1 1 1 1 0 1 1 0 0 0 -1 0 0 0 0 ,它只是一个行向量,足以迷惑其他人。使用更好的样本数据并发布您的循环解决方案!感谢您帮助我们。
  • 是的,你是对的。非常遗憾。我再次编辑我的帖子,希望我的问题更清楚

标签: matlab matrix max continuations


【解决方案1】:

这会计算至少有一个非零条目的连贯行数没有循环

B = ~(A==0);
idx = find(sum(B,2) == 0);
result = max([idx;size(A,1)+1] - [0;idx]) - 1;

现在您可以检查result 是否大于 11。

另一种方法是:

B = ~(A==0);
C = bwconncomp(sum(B,2)>0);
num = cellfun(@numel,C.PixelIdxList);
result = max(num);

编辑 2:考虑到循环性,即开头和结尾的行应被视为连贯,您可以这样做

B = ~(A==0);
idx = find(sum(B,2) == 0);
result = max([idx;size(A,1)+idx;size(A,1)+1] - [0;idx;size(A,1)+idx]) - 1;

编辑:我根据 Knedlsepp 的 cmets 在第一个解决方案中编辑了 result-line。

【讨论】:

  • 如果全部有,第一个就不行了。但它可以用result = max([idx(1:end);size(A,1)+1] - [0;idx(1:end)]) - 1;之类的东西来解决
  • 刚刚意识到(1:end) 现在是多余的。 :-)
  • :-D 很抱歉一直在这里发表评论,但 +1 仍然不见了 ;-)
  • 道歉不是你的事!抱歉这么草率
【解决方案2】:

这是一个有点笨拙的解决方案,但至少在矩阵不太大的情况下它应该给出一个解决方案。如果您调用矩阵m,请尝试以下代码行:

log2(max([cumprod(2*logical(m),2),ones(size(m,1),1)],[],2))

我希望这会有所帮助!

编辑:

现在问题的含义已经很清楚了,下面是一个应该有效的答案:

find(~[m(:,1)|m(:,2)|m(:,3);0],1)-1 >= 11

【讨论】:

  • 我认为这在 [0 1 1 0 1] 这样的向量上失败了,但你的方向是正确的......
  • 是的。感谢@ Jens,但在不以 1 开头的向量上失败
  • 我已经编辑了我的答案,因此它也适用于第一个条目为零的情况。但是您应该注意到,我的解决方案并不总是比使用 find([m(i,:),0]==0,1)-1 之类的简单 for 循环快。如果有很多行,我的解决方案是最好的,如果有很多列,for 解决方案会更好。
  • 抱歉这个错误,但我编辑了我的主帖,因为我的问题不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2014-01-31
  • 2022-11-27
  • 2020-03-30
相关资源
最近更新 更多