如何在Matlab中轻松创建向量的动态2D矩阵

如何在Matlab中轻松创建向量的动态2D矩阵,matlab,Matlab,根据我的代码: G=zeros(height,width); %zeros or whatever for y = 1 : height for x = 1 : width magnitude = sqrt(Gx(y,x)^2 + Gy(y,x)^2); gradient_direction = atan(Gy(y,x)/Gx(y,x)); G(y,x) = [magnitude gradient_direction]; e

根据我的代码:

G=zeros(height,width); %zeros or whatever

for y = 1 : height
    for x = 1 : width
         magnitude = sqrt(Gx(y,x)^2 + Gy(y,x)^2);
         gradient_direction = atan(Gy(y,x)/Gx(y,x));
         G(y,x) = [magnitude gradient_direction];
    end
end
我一直得到这个(如果我不使用zero()):

下标赋值维度不匹配

或者这个:

赋值的非单例rhs维度比非单例rhs维度多 下标

通过使用
G(y,x,:)=[幅值,梯度_方向]您正试图将两个值分配给为索引为
(y,x)
的单个值保留的点。解决这个问题的一种方法是使用三维数组G

G=zeros(height,width,2);

for y = 1 : height
    for x = 1 : width
         magnitude = sqrt(Gx(y,x)^2 + Gy(y,x)^2);
         gradient_direction = atan(Gy(y,x)/Gx(y,x));
         G(y,x,:) = [magnitude, gradient_direction];
    end
end
现在,在每个点G(y,x)上,您可以存储这两个值并访问它们,例如
G(1,2,1)
(1,2)
位置处的
magnity
梯度方向的
G(1,2,2)
。这假设
Gx
Gy
都是大小高x宽的数组


需要注意的重要一点是,沿三维方向的G切片也将是3D阵列,即
mag_dir=G(3,2,:)
将具有大小
[12]
,而不是
[12]
。在某些应用中,这可能会导致错误,例如尝试将
mag_dir
与另一个向量(没有额外维度)和线性代数操作连接起来

要解决此问题,请使用将维度显式更改为目标维度。对于这里的向量,它将是
重塑(mag_dir,1,2)
。同样适用于2D切片,如
more\u md=G(1,:,:)
——这将需要例如
more\u md=restrape(more\u md,2,5)

使用
G(y,x,:)=[幅度,梯度方向]您正试图将两个值分配给为索引为
(y,x)
的单个值保留的点。解决这个问题的一种方法是使用三维数组G

G=zeros(height,width,2);

for y = 1 : height
    for x = 1 : width
         magnitude = sqrt(Gx(y,x)^2 + Gy(y,x)^2);
         gradient_direction = atan(Gy(y,x)/Gx(y,x));
         G(y,x,:) = [magnitude, gradient_direction];
    end
end
现在,在每个点G(y,x)上,您可以存储这两个值并访问它们,例如
G(1,2,1)
(1,2)
位置处的
magnity
梯度方向的
G(1,2,2)
。这假设
Gx
Gy
都是大小高x宽的数组


需要注意的重要一点是,沿三维方向的G切片也将是3D阵列,即
mag_dir=G(3,2,:)
将具有大小
[12]
,而不是
[12]
。在某些应用中,这可能会导致错误,例如尝试将
mag_dir
与另一个向量(没有额外维度)和线性代数操作连接起来


要解决此问题,请使用将维度显式更改为目标维度。对于这里的向量,它将是
重塑(mag_dir,1,2)
。同样适用于2D切片,如
more\u md=G(1,:,:)
——这将需要例如
more\u md=restrape(more\u md,2,5)

虽然@atru-answer有效,但如果有帮助的话,我想建议一种更快更整洁的矢量化方法。此处的操作可以轻松转换为矢量化操作:

G=cat(3,hypot(Gy,Gx),atan(Gy./Gx));

虽然@atru-answer有效,但如果有帮助的话,我想建议一种更快更整洁的矢量化方法。此处的操作可以轻松转换为矢量化操作:

G=cat(3,hypot(Gy,Gx),atan(Gy./Gx));

酷:)有一件事,当你使用三维数组并在第三维切片时,比如
x=A(3,2,:)
你不会得到一维和二维数组,你会得到大小像[1,3,1]的数组,即仍然是三维的,而不仅仅是[1,3]。要将这些切片用作1D和2D阵列,您需要使用
重塑
。如果您愿意,我可以添加一个快速示例。许多操作实际上都会起作用。当我在3个空间维度上编程时遇到了问题,当时我正试图可视化/处理数据的横截面。明天我会查看这些代码,如果我发现有用的东西,也许会更新。@Trt Trt为什么不将其保留为两个不同的2D变量?@Adiel不知道确切的原因,但在科学计算中,你希望将某些东西像这样保持在一起的情况并不少见。特别是当他们提到单个2D对象(图像、空间等)的属性时。对,但这似乎让他头痛多于好处。无论如何,我会将它存储为一个具有不同字段的结构。首先,当你使用三维数组并在第三维切片时,比如
x=a(3,2,:)
你不会得到一维和二维数组,你会得到大小像[1,3,1]的数组,也就是说,仍然是三维的,而不仅仅是[1,3]。要将这些切片用作1D和2D阵列,您需要使用
重塑
。如果您愿意,我可以添加一个快速示例。许多操作实际上都会起作用。当我在3个空间维度上编程时遇到了问题,当时我正试图可视化/处理数据的横截面。明天我会查看这些代码,如果我发现有用的东西,也许会更新。@Trt Trt为什么不将其保留为两个不同的2D变量?@Adiel不知道确切的原因,但在科学计算中,你希望将某些东西像这样保持在一起的情况并不少见。特别是当他们提到单个2D对象(图像、空间等)的属性时。对,但这似乎让他头痛多于好处。无论如何,我会将其存储为具有不同字段的结构。这是一个更好的解决方案。人们也可以考虑使用,这是一个更好的解决方案。人们也可以考虑使用。