[已解决] 关于matlab使用for循环(数据归一化)的问题

[复制链接]
秋风暖暖 发表于 2020-12-5 10:38:42
本帖最后由 秋风暖暖 于 2020-12-5 10:43 编辑
  1. clc;
  2. clear;

  3. x=[
  4.      16     2     3    13  16
  5.      5    11    10     1   20
  6.      9     7     6    12    5
  7.      4    14    0     1    63 ]
  8. N=size(x,1);
  9. for i=1:N
  10.     A=x(i,:);
  11.     a=max(x(i,:));
  12.     b=min(x(i,:));
  13.    
  14. for j=1:5
  15.         B=(x(:,:)-b(:,:))/(a(:,:)-b(:,:));
  16. end
  17. end
复制代码
初次接触matlab,都不是很熟悉for的使用,我的目的是,计算矩阵每一行的最大值和最小值,然后对于矩阵的每一行进行归一化处理,但是我发现我在运行的时候只能读取最后一行的数据,并不能都进行归一化处理。
        就是将数组x按照每一行都进行x_i^'=(x_i-x_min)/(x_max-x_min )处理。
请问应该怎么正确使用for循环实现上述功能呢?十分感谢!

就是将数组的数据全部归一化到(0,1)之间。

最佳答案


gopher 发表于 2020-12-5 13:45:10
你好,求矩阵每行或每列的最大最小值,无需使用 for 循环,只要用 min 或 max 函数即可,可以查阅 min 或 max 的帮助文档 doc min 或 doc max 即可。

以下是你的例子,其中有两个方法,一个要求新版本支持,另外一个新老版本皆可。
  1. clc;
  2. clear;

  3. x=[
  4.      16     2     3    13  16
  5.      5    11    10     1   20
  6.      9     7     6    12    5
  7.      4    14    0     1    63 ];
  8. xmin = min(x, [], 2);
  9. xmax = max(x, [], 2);

  10. % 方法一、需要 matlab 高版本
  11. B = (x-xmin)./(xmax-xmin);

  12. % % 方法二、版本较旧,具体哪个版本以前,我不清楚
  13. % N = size(x,2);
  14. % b = repmat(xmin, 1, N);
  15. % a = repmat(xmax, 1, N);
  16. % B = (x-b) ./ (a-b);
复制代码


结果如下:
  1. >> xmin

  2. xmin =

  3.      2
  4.      1
  5.      5
  6.      0

  7. >> xmax

  8. xmax =

  9.     16
  10.     20
  11.     12
  12.     63

  13. >> B

  14. B =

  15.   Column 1

  16.                          1
  17.          0.210526315789474
  18.          0.571428571428571
  19.         0.0634920634920635

  20.   Column 2

  21.                          0
  22.          0.526315789473684
  23.          0.285714285714286
  24.          0.222222222222222

  25.   Column 3

  26.         0.0714285714285714
  27.          0.473684210526316
  28.          0.142857142857143
  29.                          0

  30.   Column 4

  31.          0.785714285714286
  32.                          0
  33.                          1
  34.         0.0158730158730159

  35.   Column 5

  36.                          1
  37.                          1
  38.                          0
  39.                          1
复制代码

回复此楼

6 条回复


gopher 发表于 2020-12-5 13:45:10
你好,求矩阵每行或每列的最大最小值,无需使用 for 循环,只要用 min 或 max 函数即可,可以查阅 min 或 max 的帮助文档 doc min 或 doc max 即可。

以下是你的例子,其中有两个方法,一个要求新版本支持,另外一个新老版本皆可。
  1. clc;
  2. clear;

  3. x=[
  4.      16     2     3    13  16
  5.      5    11    10     1   20
  6.      9     7     6    12    5
  7.      4    14    0     1    63 ];
  8. xmin = min(x, [], 2);
  9. xmax = max(x, [], 2);

  10. % 方法一、需要 matlab 高版本
  11. B = (x-xmin)./(xmax-xmin);

  12. % % 方法二、版本较旧,具体哪个版本以前,我不清楚
  13. % N = size(x,2);
  14. % b = repmat(xmin, 1, N);
  15. % a = repmat(xmax, 1, N);
  16. % B = (x-b) ./ (a-b);
复制代码


结果如下:
  1. >> xmin

  2. xmin =

  3.      2
  4.      1
  5.      5
  6.      0

  7. >> xmax

  8. xmax =

  9.     16
  10.     20
  11.     12
  12.     63

  13. >> B

  14. B =

  15.   Column 1

  16.                          1
  17.          0.210526315789474
  18.          0.571428571428571
  19.         0.0634920634920635

  20.   Column 2

  21.                          0
  22.          0.526315789473684
  23.          0.285714285714286
  24.          0.222222222222222

  25.   Column 3

  26.         0.0714285714285714
  27.          0.473684210526316
  28.          0.142857142857143
  29.                          0

  30.   Column 4

  31.          0.785714285714286
  32.                          0
  33.                          1
  34.         0.0158730158730159

  35.   Column 5

  36.                          1
  37.                          1
  38.                          0
  39.                          1
复制代码

回复此楼

秋风暖暖 发表于 2020-12-5 16:09:04
gopher 发表于 2020-12-5 13:45
你好,求矩阵每行或每列的最大最小值,无需使用 for 循环,只要用 min 或 max 函数即可,可以查阅 min 或 m ...

学到了  十分感谢   :lol

kaaaf123 发表于 2020-12-5 16:39:23
可以用 MATLAB R2018a 引入的 normalize 函数:
normalize(x, 2, 'range')


guojiangtao 发表于 2020-12-5 21:39:33
楼主是严格的归一化到[0,1]?还是只是最大值为1?,如果是前者可以试试mapminmax函数,查看帮助doc mapminmax。

秋风暖暖 发表于 2020-12-6 09:26:26
kaaaf123 发表于 2020-12-5 16:39
可以用 MATLAB R2018a 引入的 normalize 函数:
normalize(x, 2, 'range')

十分感谢  已经学到了

秋风暖暖 发表于 2020-12-6 09:26:59
guojiangtao 发表于 2020-12-5 21:39
楼主是严格的归一化到[0,1]?还是只是最大值为1?,如果是前者可以试试mapminmax函数,查看帮助doc mapminm ...

好的  十分感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表