Dan*_*ong 1 matlab matrix reshape
基本上我有一个原始的128 x 128 x 3矩阵,它描述了一个RGB图像(128*128点,每个点分别是一个包含红色,绿色和蓝色强度的1x3矢量),我也从中选择了16个点(这个是容易的部分),现在我想在128 x 128 x 3矩阵和16点之间进行成对距离计算.
但问题是Matlab的功能,"pdist2"只需要2个大小为M1 x N和M2 x N的矩阵而不是其他任何东西,所以我打算将128 x 128 x 3矩阵转换为(128*128) x 3一个.稍后,在使用新变换的矩阵进行一些计算之后,我需要将其转换回原始大小以显示图像并检查结果.但我不确定这些元素是否会保留在原位或是否会被拖曳?请帮助我非常感谢!
从文档中
B中的数据类型和元素数量与A中的数据类型和元素数量相同.B中的元素保留了 A中的列式顺序.
如果您需要的结果与原始结果大小相同,只需在初始转换之前存储大小,并reshape在执行数据操作后将其用作输入.
% Store the original size
originalSize = size(data);
% Reshape it to your new 2D array
data = reshape(data, [], 3);
% Do stuff
% Reshape it back to it's original size
data = reshape(data, originalSize);
Run Code Online (Sandbox Code Playgroud)
在2D版本中,元素在技术上不会与它们在3D矩阵中处于相同的位置,因为......好吧......它的2D而不是3D.但是,如果您将其重新塑造回3D(不移动元素),则元素排序将与原始3D矩阵相同.
更新
您可以自己轻松检查.
R = rand([10, 20, 3]);
isequal(R, reshape(reshape(R, [], 3), size(R)))
Run Code Online (Sandbox Code Playgroud)
原因为何,这是因为reshape实际上不改变基础数据,而是在其访问的方式.我们可以通过使用format debug来查看数据的存储位置来轻松检查.
我们也可以使用我写的一个小匿名函数来查看存储器中存储给定变量的位置.
format debug;
memoryLocation = @(x)regexp(evalc('disp(x)'), '(?<=pr\s*=\s*)[a-z0-9]*', 'match')
Run Code Online (Sandbox Code Playgroud)
好的,让我们创建一个矩阵并检查MATLAB将其存储在内存中的位置
A = rand(10);
memoryLocation(A)
% 7fa58f2ed9c0
Run Code Online (Sandbox Code Playgroud)
现在让我们重塑它并再次检查内存位置以查看它是否在不同的位置(即订单或值被修改)
B = reshape(A, [], 10);
memoryLocation(B)
% 7fa58f2ed9c0
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,存储位置并没有改变这意味着元素的顺序有是相同的,否则MATLAB会需要做一个拷贝到内存中.