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
行。
我需要在 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
行。