如何在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对象(图像、空间等)的属性时。对,但这似乎让他头痛多于好处。无论如何,我会将其存储为具有不同字段的结构。这是一个更好的解决方案。人们也可以考虑使用,这是一个更好的解决方案。人们也可以考虑使用。