matlab中连续值的总和

sum of continuous values in matlab

我需要在 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 行是最大连贯行之间没有完整的零行。

对不起,我的第一个 post 不正确。

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

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个点是圆形的。这分钟第一个点和最后一个点连接。

感谢您的帮助,请原谅我的困惑。

这是一个有点笨拙的解决方案,但至少在矩阵不太大的情况下它应该给出一个解决方案。如果您调用矩阵 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

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

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 的评论编辑了第一个解决方案中的 result 行。