【问题标题】:How to normalise each corresponding column in several matrices to values between -1 and 1 in Matlab?如何将多个矩阵中的每个对应列标准化为 Matlab 中 -1 和 1 之间的值?
【发布时间】:2016-11-12 14:14:14
【问题描述】:

我有几个矩阵,每个矩阵的列数相同,但行数不同。每个矩阵都包含正值和负值。为了分组(因为有很多矩阵),每个矩阵都存储在一个二维单元阵列中。一个小例子:

Matrix1:
          C1  C2  C3
  Val1     6   7   1
  Val2     3   9  -7
  Val3   -12 -22  -4

Matrix2:
          C1  C2  C3
  Val1     5  19  -2
  Val2     4  21   9
  Val3    -1   3  11 
  Val4   -30  13   7
  Val5     3  -4  10

matrixStore{1,1} = Matrix1
matrixStore{1,2} = Matrix2

我正在尝试以按列、跨矩阵的方式将值标准化为 -1 到 1 的范围。 所以,使用这个例子,我得到每列的最大值和最小值,并将它们放在两个向量中:

% C1: Max = 6, Min = -30
% C2: Max = 21, Min = -22
% C3: Max = 11, Min = -7

maxVals = [6, 21, 11];
minVals = [-30, -22, -7];

我现在如何应用最大值和最小值来规范化所有矩阵的每一列?

我使用以下代码来获取最大值和最小值:

maxColsBuilder = [];
minColsBuilder = [];

% Find the max values for each column in every matrix and stack them together 
maxColValsFromCell = cellfun(@max, matrixStore(1,:), 'Uni', 0);
maxColMatrix = cell2mat(maxColValsFromCell');
maxColsBuilder = [maxColsBuilder, maxColMatrix'];

% Do the same for the min values
minColValsFromCell = cellfun(@min, matrixStore(1,:), 'Uni', 0);
minColMatrix = cell2mat(minColValsFromCell');
minColsBuilder = [minColsBuilder, minColMatrix'];

% Find the max values for each column
maxVals = (max( maxColsBuilder, [], 2 ))'

% Also find the min values for column
minVals = (min( minColsBuilder, [], 2 ))'

谁能帮我根据需要使用这些向量来规范化我的数据?

【问题讨论】:

  • 请提供实际样本数据。我不太明白您的数据是如何格式化的。 matSamples 是一个二维元胞数组,其中每个元胞都是一个矩阵列表吗?
  • 矩阵的大小是否相同?如果是,请考虑使用 cell2mat 将矩阵堆叠在 3-D 数组 MyMat 中,然后直接调用 min(MyMat,3)max(MyMat,3)
  • 嗨,matSamples 是一个二维单元阵列,其中每个单元包含一个 m x n 矩阵,其中 m = 样本值(行)和 n = 通道(列)。对于每个矩阵,总是有 12 个通道,但样本值的数量会有所不同。抱歉,我现在意识到我错误地描述了matSamples。我会相应地编辑我的帖子。

标签: matlab matrix normalization


【解决方案1】:

matrixStore 中每个矩阵的以下代码显示矩阵的标准化版本:

[unknown, matrices] = size(matrixStore);
for matrixIndex = 1:matrices
    [rows, columns] = size(matrixStore{1,matrixIndex});
    normMatrix = matrixStore{1,matrixIndex};
    for row = 1:rows;
        for column = 1:columns;
            normMatrix(row,column) = -1 + 2.*(matrixStore{1,matrixIndex}(row,column) - minVals(column))./(maxVals(column) - minVals(column));
        end; 
    end; 
    normMatrix
end;

对于您提供的示例:

normMatrix1 =
 1.0000    0.3488   -0.1111
 0.8333    0.4419   -1.0000
      0   -1.0000   -0.6667

normMatrix2 =
 0.9444    0.9070   -0.4444
 0.8889    1.0000    0.7778
 0.6111    0.1628    1.0000
-1.0000    0.6279    0.5556
 0.8333   -0.1628    0.8889 

如果您有较新版本的 Matlab,您可以改用 normc 函数。

【讨论】:

  • 效果很好@Tomáš。在自己进行了进一步搜索之后,我已经能够编写一些产生相同答案的代码,但是使用bsxfun 函数来广播矩阵中所有行的规范化操作。我已将此添加为我的问题的答案,供其他人评论。
【解决方案2】:

在进行了一些额外的搜索后,我找到了@rayryeng 对这个问题 (Min-max normalization of individual columns in a 2D matrix) 的回答,我对其进行了修改以适应:

[unknown, matrices] = size(matrixStore);
for matrixIndex = 1:matrices
    normMatrix = matrixStore{1, matrixIndex};
    normMatrix = bsxfun(@minus, bsxfun(@rdivide, bsxfun(@minus, normMatrix, minVals), maxVals - minVals), 0.5) * 2
end;

这给出了与@TomášKratochvíla 在他的回答中列出的相同的输出。 当我将这两种方法应用于一些实际样本数据时,由 6 个矩阵组成,包含 12 列和数千行,我发现使用 bsxfun 的方法更快。

如果有人对任一答案有任何进一步的信息,请随时添加 cmets。

【讨论】:

  • 感谢您在回答中引用我。请通过对我的回答投赞成票来支付它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2012-12-26
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多