matlab中两个不同阶数矩阵的加法

matlab中两个不同阶数矩阵的加法,matlab,Matlab,我对matlab是新手。我看到一幅42 X 25的图像。我沿着图像的x轴和y轴取导数。 当我沿x轴取导数时,图像的阶数变成42 x 24,当我沿Y轴取导数时,图像的阶数变成41 x 25 现在我想把这两个矩阵相加。但是它们的顺序不同,所以我不能。但若我在图像沿x轴的导数中附加一列零,在图像沿y轴的导数中附加一行零。这东西可以使矩阵的阶数相同 I = imread('abc.jpg'); BW=im2bw(I,graythresh(I)); I_derived_x = diff(BW, 1,

我对matlab是新手。我看到一幅42 X 25的图像。我沿着图像的x轴和y轴取导数。 当我沿x轴取导数时,图像的阶数变成42 x 24,当我沿Y轴取导数时,图像的阶数变成41 x 25

现在我想把这两个矩阵相加。但是它们的顺序不同,所以我不能。但若我在图像沿x轴的导数中附加一列零,在图像沿y轴的导数中附加一行零。这东西可以使矩阵的阶数相同

I = imread('abc.jpg');

BW=im2bw(I,graythresh(I));

I_derived_x = diff(BW, 1, 2);
I_derived_y = diff(BW, 1, 1);
现在我想做什么

SUM = I_derived_x + I_derived_y 

因此,请帮助我确定这两个矩阵的顺序。提前感谢使用
diff
计算导数是很有用的,但您必须理解:
diff
基本上计算正向有限差分;因此,只从
N
点中获得
N-1
导数值是有意义的

你可以用零填充来解决这个问题(这会把你的边缘弄得一团糟)

使用中心有限差分在中间点的点和向前/向后有限差分上的边点。< /P> 更多信息:

编辑:在您的情况下,这将分解为:

I_derived_x = 0.5*[BW(:,2)-BW(:,1)  ,  0.5*(BW(:,3:end)-BW(:,1:end-2))  ,  BW(:,2)-BW(:,1)];
I_derived_y = 0.5*[BW(2,:)-BW(1,:)  ;  0.5*(BW(3:end,:)-BW(1:end-2,:))  ;  BW(2,:)-BW(1,:)];
它给出了与
BW
相同网格上的导数。这很容易让你得到你想要的总数

SUM = I_derived_x + I_derived_y

使用
diff
计算导数是很有用的,但你必须理解:
diff
基本上计算正向有限差分;因此,只从
N
点中获得
N-1
导数值是有意义的

你可以用零填充来解决这个问题(这会把你的边缘弄得一团糟)

使用中心有限差分在中间点的点和向前/向后有限差分上的边点。< /P> 更多信息:

编辑:在您的情况下,这将分解为:

I_derived_x = 0.5*[BW(:,2)-BW(:,1)  ,  0.5*(BW(:,3:end)-BW(:,1:end-2))  ,  BW(:,2)-BW(:,1)];
I_derived_y = 0.5*[BW(2,:)-BW(1,:)  ;  0.5*(BW(3:end,:)-BW(1:end-2,:))  ;  BW(2,:)-BW(1,:)];
它给出了与
BW
相同网格上的导数。这很容易让你得到你想要的总数

SUM = I_derived_x + I_derived_y

我编写了函数
diff
,正好解决了这个问题。它执行与
diff
相同的操作,但它用
NaN
填充输出,使其与输入大小相同。如果您不希望输出中出现
NaN
,可以将对
NaN
的调用替换为对
zeros
的调用

请注意,这不适用于高维数组(即维度大于2)

函数d=diff(x,n,dim)
%“区分矩阵的列/行,并返回相同的结果”
%“尺寸与原件相同”
如果nargin<2
n=1;
结束
如果nargin<3
dim=1;
结束
如果dim==2
x=转置(x);
结束
k=尺寸(x,2);
d=[NaN(n,k);diff(x,n)];
如果dim==2
d=转置(d);
结束
结束

您现在可以使用原始代码,对
diff
的调用替换为对
diff
的调用我编写的函数
diff
正好解决了这个问题。它执行与
diff
相同的操作,但它用
NaN
填充输出,使其与输入大小相同。如果您不希望输出中出现
NaN
,可以将对
NaN
的调用替换为对
zeros
的调用

请注意,这不适用于高维数组(即维度大于2)

函数d=diff(x,n,dim)
%“区分矩阵的列/行,并返回相同的结果”
%“尺寸与原件相同”
如果nargin<2
n=1;
结束
如果nargin<3
dim=1;
结束
如果dim==2
x=转置(x);
结束
k=尺寸(x,2);
d=[NaN(n,k);diff(x,n)];
如果dim==2
d=转置(d);
结束
结束
您现在可以使用原始代码,对
diff
的调用替换为对
diff
的调用,这很烦人

  • 正如建议的那样,你可以使用零填充,但我会使用3点导数

  • 或者,你可以插值,因为我会将导数定位在数字之间的1/2处。编写
    interp2
    命令应该很容易。你需要决定是想推断边界,还是干脆不去

  • 是的,那很烦人

    • 正如建议的那样,你可以使用零填充,但我会使用3点导数

    • 或者,你可以插值,因为我会将导数定位在数字之间的1/2处。编写
      interp2
      命令应该很容易。你需要决定是想推断边界,还是干脆不去

    通过研究,我找到了我所寻求的解决方案。这是如何在矩阵中添加零的行/列

    I_derived_x = padarray(I_derived_x,[0 1],0,'post'); 
    I_derived_y = padarray(I_derived_y,[1 0],0,'post');
    
    在函数中,第一个参数是矩阵,第二个参数是顺序,表示我想在
    I_derived_x
    矩阵中再添加一列,而没有行,第三个参数表示我想如何填充它,就像在我的例子中,我想让它填充零,最后一个参数指定新添加的行/列的方向,因为我想把它放在矩阵的末尾,所以我在这里使用了
    post

    通过研究,我找到了我正在寻找的解决方案。这是如何在矩阵中添加零的行/列

    I_derived_x = padarray(I_derived_x,[0 1],0,'post'); 
    I_derived_y = padarray(I_derived_y,[1 0],0,'post');
    
    在函数中,第一个参数是矩阵,第二个参数是顺序,表示我想在
    I_derived_x
    矩阵中再添加一列,而没有行,第三个参数表示我想如何填充它,就像在我的例子中,我想让它填充零,最后一个参数指定新添加的行/列的方向,因为我想把它放在矩阵的末尾,所以我在这里使用了
    post

    请参阅以获得多个解决方案。请参阅以获得多个解决方案。