Matlab 规范化三维矩阵的每个切片

Matlab 规范化三维矩阵的每个切片,matlab,matrix,3d,Matlab,Matrix,3d,如何规范化3D矩阵的每个切片?我试着这样做: a=rand(1,100,3481); a= (a - min(a)) ./ (max(a)-min(a)); % 在右侧,矩阵的每个切片的范围应为0到1。但事实并非如此,我在一些切片中没有找到1。当我检查时,min(a)和max(a)返回了3D中的相应值。因此,使用上述代码应该没有问题。3D矩阵有什么我错过的吗?提前谢谢 我们需要找到每个2D切片的最小值和最大值,然后我们可以使用在的帮助下以矢量化的方式执行这些操作,以使单个DIM正确对齐,从而

如何规范化3D矩阵的每个切片?我试着这样做:

a=rand(1,100,3481);
a= (a - min(a)) ./ (max(a)-min(a)); % 

在右侧,矩阵的每个切片的范围应为
0
1
。但事实并非如此,我在一些切片中没有找到
1
。当我检查时,
min(a)
max(a)
返回了3D中的相应值。因此,使用上述代码应该没有问题。3D矩阵有什么我错过的吗?提前谢谢

我们需要找到每个2D切片的最小值和最大值,然后我们可以使用在的帮助下以矢量化的方式执行这些操作,以使单个DIM正确对齐,从而让
bsxfun
执行其广播任务(或在那里使用
重塑

因此,实施将是必要的-

mins = min(reshape(a,[],size(a,3)));
maxs = max(reshape(a,[],size(a,3)));
a_offsetted = bsxfun(@minus, a, permute(mins,[1,3,2]));
a_normalized = bsxfun(@rdivide, a_offsetted, permute(maxs-mins,[1,3,2]))
样本输入、输出-

>> a
a(:,:,1) =
     2     8     2     2
     8     3     8     2
a(:,:,2) =
     8     1     1     5
     4     9     8     6
a(:,:,3) =
     7     9     3     5
     6     2     6     5
a(:,:,4) =
     9     3     4     9
     7     1     9     9
>> a_normalized
a_normalized(:,:,1) =
         0    1.0000         0         0
    1.0000    0.1667    1.0000         0
a_normalized(:,:,2) =
    0.8750         0         0    0.5000
    0.3750    1.0000    0.8750    0.6250
a_normalized(:,:,3) =
    0.7143    1.0000    0.1429    0.4286
    0.5714         0    0.5714    0.4286
a_normalized(:,:,4) =
    1.0000    0.2500    0.3750    1.0000
    0.7500         0    1.0000    1.0000

我的选择是不重塑,因为有时有点难以理解。我使用min-max和您希望用于与repmat进行标准化以克隆的维度…:

a=rand(1,100,3481);

a_min2 = min(a,[],2);
a_max2 = max(a,[],2);
a_norm2 = (a - repmat(a_min2,[1 size(a,2) 1]) ) ./ repmat( (a_max2-a_min2),[1 size(a,2) 1]);
或者如果在第三个维度上正常化

a_min3 = min(a,[],3);
a_max3 = max(a,[],3);
a_norm3 = (a - repmat(a_min3,[1 1 size(a,3)]) ) ./ repmat( (a_max3-a_min3),[1 1 size(a,3)]);

为什么你要假设每个片都有
1
?我正在将值标准化为
0
1
,这不应该给我
0
作为最小值和
1
作为最大值吗?不能保证每个片都有数组的最小值和最大值,这是唯一会是0和1的值,这很奇怪,如果您尝试使用
a=randi([110],[1100])
,您的代码可以正常工作。但是,如果您尝试
a=rand(1100100)
,它将不起作用。这是非常重要的strange@GregorIsack它为我工作了-
a=rand(1100100)
。你能再检查一下吗?@GregorIsack你怎么检查它是否工作?不要做
==0
==1
的事情。这些是浮动pt值。所以,在这里使用公差。类似于:
tol=1e-4。然后,执行:
all(any(any(abs(a_normalized-0)
all(any(abs(a_normalized-1)
。抱歉,我花了一些时间仔细检查了一下。我的笔记本电脑好像有点“记忆滞后”。它在我的另一台笔记本电脑上运行得非常好。我重新启动了我的笔记本电脑,应该没问题。关于你提到的公差,如果我使用
find(a_normalized==1)
,那也会是一个问题?@GregorIsack使用
find(abs(a_normalized-1)
,然后
ind2sub
沿着三个DIM中的每一个获得相应的索引。