找回密码
 注册
Simdroid-非首页
查看: 99|回复: 2

询问一下矩阵换极大极小值找出其他点位置的程序实现

[复制链接]
发表于 2011-5-15 15:35:40 | 显示全部楼层 |阅读模式 来自 台湾
悬赏10仿真币已解决
本帖最后由 武神裝攻 于 2011-5-16 11:30 编辑

小弟一直烦劳各位 实在不好意思 请见谅  如果题目看不懂的请密小弟
QQ:1247396969
原理其实很简单 但是小弟愚笨不太会实现程序请见谅
就是我有个A矩阵例如
A=[ 1   4   8   9   2   1;
      2   3   3   3   4   8;
      9   8   7   4   6   2;
      4   5   7   8   9   4]
以第一行为例  首先找出每一直行的最大值与最小值如下所示
(红色是最大 蓝色最小 黑色是中间值)
A(:,1)=[ 1  ;                        A=[ 1   4   8   9   2   1;
             2  ;                              2   3   3   3   4   8;
             9  ;                              9   8   7   4   6   2;
             4  ]                              4   5   6   8   9   4]
再来小弟希望求得各行中间值的占比位置以第一行为例
(最大值-最小值=距离)=>9-1=8     [(中间值-最小值)/距离]=位置 =>(2 -1) / 8 =0.125 &  (4 -1) / 8 =0.375
第二行为例 : (最大值-最小值=距离)=>8-3=5     [(中间值-最小值)/距离]=位置 =>(4 -3) / 5 =0.2  &  (5 -3) / 5 =0.4
第三行为例 : (最大值-最小值=距离)=>8-3=5     [(中间值-最小值)/距离]=位置 =>(7 -3) / 5 =0.8  &  (6 -3) / 5 =0.6
第四行为例 : (最大值-最小值=距离)=>9-3=6     [(中间值-最小值)/距离]=位置 =>(4 -3) / 6=0.1666666666667  &  (8 -3) / 6=0.8333333333
第五行为例 : (最大值-最小值=距离)=>9-2=7     [(中间值-最小值)/距离]=位置 =>(4 -2) / 7 =0.285714285714  &  (6 -2) / 7 =0.5714285714
第六行为例 : (最大值-最小值=距离)=>8-1=7     [(中间值-最小值)/距离]=位置 =>(2 -1) / 7 =0.14285714285714  &  (4 -1)/ 7 =0.42857142857

假设我的最大值最小值变为B矩阵
B=[2   8   4    2   5   1;
     6   4   8    8   1   4]
利用B矩阵跟刚刚位置求得C矩阵 C矩阵大小跟A矩阵一样大  
C的第一行如下所示
C(:,1) = [2;
              (6-2)*0.125 + 2=2.375      =   (新最大值-新最小值)*位置 +新最小值 = 新中间值
              (6-2)*0.375 + 2=3.125      =   (新最大值-新最小值)*位置 +新最小值 = 新中间值
              6];
最后答案C=
C=[   2         4       4       2                 1                    1         ;
     2.375     4.8     7.2    大約3         2.14285714   1.428571    ;
     3.125     5.6     6.4    6.999999   3.285714       2.285714    ;
         6         8       8       8                5                     4         ]

最佳答案

查看完整内容

和lz给的结果不一样,有可能是lz对加法的定义和Matlab不一样,这样的话可以重载plus函数来实现的,通过面向对象操作
发表于 2011-5-15 15:35:41 | 显示全部楼层 来自 河北廊坊
Simdroid开发平台
  1. clear;clc;close all
  2. format shortG
  3. A = [1 4 8 9 2 1;
  4. 2 3 3 3 4 8;
  5. 9 8 7 4 6 2;
  6. 4 5 7 8 9 4 ];
  7. FP = struct('ymin',0,'ymax',1);
  8. [y1,PS] = mapminmax(A',FP);
  9. y1(y1 == 1) = 0;
  10. p = reshape(nonzeros(y1'),2,[]);
  11. B = [ 2 8 4 2 5 1
  12. 6 4 8 8 1 4 ];
  13. C = zeros(4,length(B));
  14. C([1,4],:) = sort(B);
  15. C(2:3,:) = bsxfun(@plus,bsxfun(@times,range(B),p), C(1,:))
复制代码

  1. C =
  2.             2            4            4            2            1            1
  3.           2.5          4.8          7.2            3       2.1429       1.4286
  4.           3.5          5.6          7.2            7       3.2857       2.2857
  5.             6            8            8            8            5            4
复制代码

和lz给的结果不一样,有可能是lz对加法的定义和Matlab不一样,这样的话可以重载plus函数来实现的,通过面向对象操作

评分

1

查看全部评分

回复

使用道具 举报

发表于 2011-5-18 09:38:21 | 显示全部楼层 来自 湖南湘潭
  1. format short g

  2. A = [ ...
  3.     1 4 8 9 2 1;
  4.     2 3 3 3 4 8;
  5.     9 8 7 4 6 2;
  6.     4 5 7 8 9 4 ];
  7. min_A = min(A, [ ], 1);
  8. max_A = max(A, [ ], 1);
  9. length = max_A - min_A;

  10. for k = 1 : size(A,2)
  11.     CC(:,k) = (A(:,k)-min_A(k)) / length(k);
  12. end


  13. B = [ 2 8 4 2 5 1
  14.       6 4 8 8 1 4 ];

  15. min_A = min(B, [ ], 1);
  16. max_A = max(B, [ ], 1);
  17. length = max_A - min_A;

  18. for k = 1 : size(A,2)
  19.     C(:,k) = length(k)*CC(:,k)+min_A(k);
  20. end
  21. C
复制代码
C =

            2          4.8            8            8            1            1
          2.5            4            4            2       2.1429            4
            6            8          7.2            3       3.2857       1.4286
          3.5          5.6          7.2            7            5       2.2857

评分

1

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 14:13 , Processed in 0.047396 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表