matlab中带条件的矩阵求和

matlab中带条件的矩阵求和,matlab,sum,Matlab,Sum,假设我有一个10x10的矩阵M M=[64 36 50 87 22 45 37 23 68 88; 33 23 87 49 54 25 35 98 78 52; 12 54 76 43 24 87 54 98 45 34; 77 87 23 45 34 65 23 76 12 76; 12 34 55 44 76 98 93 23 54 67; 22 55 78 90 88 56 34 23 12 76; 99 23 67 89 34 23 12 87

假设我有一个10x10的矩阵M

M=[64 36 50 87 22 45 37 23 68 88;
   33 23 87 49 54 25 35 98 78 52;
   12 54 76 43 24 87 54 98 45 34; 
   77 87 23 45 34 65 23 76 12 76; 
   12 34 55 44 76 98 93 23 54 67; 
   22 55 78 90 88 56 34 23 12 76;
   99 23 67 89 34 23 12 87 45 23; 
   22 54 76 89 65 23 45 12 93 12;
   44 56 23 88 67 14 15 67 34 12;
   11 44 77 99 34 23 78 34 12 79];
  • 我想先找出矩阵中的局部极大值
  • 然后根据最大位置,在M上的3x3区域上求和
对于第一步,我使用的代码是
local\u max=imregionalmax(M)
。找出局部最大位置,但如何进一步使用此坐标对M上的3x3矩阵求和


谢谢您的帮助。

您似乎正在寻找Matlab的矩阵子集功能

基本上,为了

M = [ 1 2 3 4 5 6;
      4 5 6 7 8 9;
      7 8 9 0 1 2;
      0 1 2 3 4 5;
      3 4 5 6 7 8;
      6 7 8 9 0 1];
如果最大值为(3,3),则可以使用M(2:4,2:4)获得

对矩阵求和就是剩下的全部——简单到

total = sum(N(:));

您可以计算整个矩阵的和,然后只保留您感兴趣的值。这应该起作用:

local_max=imregionalmax(M)
sums = imfilter(M, ones(3));
local_max_sums = sums(local_max);
如果你想要的是一个包含非零项的矩阵,其中局部极大值位于:

local_max_sums = sums .* local_max;

这对Matlab来说是一种蛮力,但我认为它是可行的

bw = imregionalmax(M);
[x,y] = find(bw);

s = [];
for i = 1:length(x)
    startX = x(i)-2;
    if(startX < 1)
        startX = 1;
    end

    endX = x(i)+2;
    if endX > 10
        endX = 10;
    end

    startY = y(i)-2;
    if startY < 1
        startY = 1;
    end

    endY = y(i)+2;
    if endY > 10
        endY = 10;
    end

    s(i) = sum2(M(startX:endX, startY:endY));
end
bw=immax(M);
[x,y]=find(bw);
s=[];
对于i=1:长度(x)
startX=x(i)-2;
如果(startX<1)
startX=1;
结束
endX=x(i)+2;
如果endX>10
endX=10;
结束
startY=y(i)-2;
如果startY<1
startY=1;
结束
endY=y(i)+2;
如果endY>10
endY=10;
结束
s(i)=sum2(M(startX:endX,startY:endY));
结束

对于每个3x3矩阵,您希望求和还是仅求以最大值为中心的矩阵?如果你有两个相同的最大值,你会怎么做?@josh,谢谢你的快速回复,所以我想要的是每个3x3矩阵的总和,其中矩阵的中心是局部最大值的位置。如果有两个相同的最大值,我想求它们的3x3矩阵之和。如果最大值恰好在边上,或者更糟糕的是在角上,会发生什么?矩阵是否“环绕”?
bw = imregionalmax(M);
[x,y] = find(bw);

s = [];
for i = 1:length(x)
    startX = x(i)-2;
    if(startX < 1)
        startX = 1;
    end

    endX = x(i)+2;
    if endX > 10
        endX = 10;
    end

    startY = y(i)-2;
    if startY < 1
        startY = 1;
    end

    endY = y(i)+2;
    if endY > 10
        endY = 10;
    end

    s(i) = sum2(M(startX:endX, startY:endY));
end