当前位置: 首页 > 知识库问答 >
问题:

如何在Matlab中将多个矩阵中的每个对应列归一化为-1和1之间的值?

徐学潞
2023-03-14

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

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 ))'

有人能帮我根据需要使用这些向量使我的数据正常化吗?

共有2个答案

孙承
2023-03-14

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,你可以使用正常函数代替。

阮鸿煊
2023-03-14

在做了一些额外的搜索后,我找到了@rayryeng对这个问题的回答(2D矩阵中单个列的最小最大归一化),我修改了这个问题以适应:

[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;

当我将这两种方法应用于一些实际的样本数据,包括6个包含12列和几千行的矩阵时,我发现使用bsxfund的方法更快。

如果有人对这两个答案有任何进一步的信息,请随时添加评论。

 类似资料:
  • 我有一个矩阵,我想和另外两个矩阵进行比较,看看我矩阵中的每个条目是包含在另外两个矩阵的值之内还是之外。例如,如果我的矩阵是: 另外两个矩阵是L和U: 和 我想取M的每个条目,比较一下它是否包含在L和U对应条目的范围内。 例如,对于M[1,1],它在-0.49416022和-0.84996737的范围之外,所以我将给这个比较赋值0。另一方面,对于M[2,3],值是-0.5240536,因此在1.14

  • 我有一个有三个带的光栅和一个有三个列的矩阵。 我想找到y的每一行和r的每一个单元格之间的角度。 我可以通过以下方式将光栅转换为矩阵: 现在,每个has矩阵都具有相同的形状(每个has矩阵中有3列,每行作为一个像素或来自y的样本)。我已经研究过如何使用嵌套的apply()函数,但老实说,我不理解语法,因此无法使其正常工作。 我有40个非常大的超光谱光栅(425个波段)和一个50行矩阵,我需要使用它来

  • 我是matlab新手,不熟悉矩阵数组。我有很多矩阵nx6: 每个矩阵都属于这种类型: 其中E和F是格式的日期。具体来说,F是时间差。 同时考虑所有矩阵,我想在列A、B、D中具有相等值的所有矩阵中求和列F的值。 对于D列的每个值(总线数),我想得到一个新的矩阵,如下所示: 提前感谢您的帮助!

  • 我有一个数据集,它有4列/属性和150行。我想用最小最大规范化来规范化这个数据。到目前为止,我的代码是: 这里,和返回全局最小值和最大值。因此,这段代码实际上对2D矩阵中的所有值应用最小-最大规范化,以便全局最小值为0,全局最大值为1。 然而,我想对每一列分别执行相同的操作。具体来说,2D矩阵的每一列都应该独立于其他列进行最小-最大规格化。 我尝试使用只是使用和,但得到的错误说矩阵维度必须一致。

  • 我必须将0到1之间的Levenshtein距离归一化。我看到不同的变化漂浮在所以。 null https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/similary/levenshteIndistance.html

  • 问题内容: 我在sql中有一个普遍的疑问。实际上,“ Top 1 1”将做什么?以下查询的含义是什么? SQL Server查询中选择“ TOP 1 1”和“ SELECT 1”之间的区别是什么? 问题答案: 表示在结果集中选择第一条记录 平均值返回1作为结果集 表示如果条件为true,并且从select返回了任何行,则仅返回顶部行,并且仅返回该行的整数(仅返回整数1就没有数据)。