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

请教find函数在多矩阵关联中的寻址问题

[复制链接]
发表于 2010-10-29 17:24:18 | 显示全部楼层 |阅读模式 来自 德国
本帖最后由 Melvin1231 于 2010-10-29 17:26 编辑

请各位帮忙看看,导师催促,我已经焦头烂额了。谢谢!
两个从excel导入的矩阵a和b, 各是4*4的,在满足取到min(-a(:)-b(:))的条件下,如何返回寻找到这时的a(:)和b(:)在各自4*4矩阵中的位置呢?find函数貌似只能针对满足单一矩阵的某一条件,比如极值下,返回在矩阵中的位置。
发表于 2010-10-29 17:38:34 | 显示全部楼层 来自 河北廊坊
Simdroid开发平台
  1. >> a=rand(4)

  2. a =

  3.     0.8147    0.6324    0.9575    0.9572
  4.     0.9058    0.0975    0.9649    0.4854
  5.     0.1270    0.2785    0.1576    0.8003
  6.     0.9134    0.5469    0.9706    0.1419

  7. >> b=rand(4)

  8. b =

  9.     0.4218    0.6557    0.6787    0.6555
  10.     0.9157    0.0357    0.7577    0.1712
  11.     0.7922    0.8491    0.7431    0.7060
  12.     0.9595    0.9340    0.3922    0.0318

  13. >> c=-a-b

  14. c =

  15.    -1.2365   -1.2881   -1.6362   -1.6126
  16.    -1.8215   -0.1333   -1.7226   -0.6566
  17.    -0.9192   -1.1276   -0.9007   -1.5063
  18.    -1.8729   -1.4809   -1.3628   -0.1737

  19. >> [~,e]=min(c(:))

  20. e =

  21.      4

  22. >> [I,J] = ind2sub(size(c),e)

  23. I =

  24.      4


  25. J =

  26.      1
复制代码
不知道你是不是要这个结果

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-10-29 17:57:35 | 显示全部楼层 来自 湖南湘潭
多看看函数本身的帮助文件,Matlab提供的功能有时比我们想象的要多。
如min、max等本身就可以直接返回位置信息的。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-29 18:30:47 | 显示全部楼层 来自 德国
感谢斑竹大人qi的热心帮助!
我之前可能没有表述清楚,这里的4*4的a,b两个矩阵不是简单的一一对应相减,而是一个循环的相减,最后生成的-a(:)-b(:)矩阵是16*16,称为c。在这个c中满足min的条件,但是需要返回到的位置,不是这个min在c中的行列位置(help里有对应例子),而是满足了这个条件的a(:),b(:)在原先各自4*4矩阵中行列位置。
我看过了help find,但是没有找到针对性的信息。
回复 不支持

使用道具 举报

发表于 2010-10-29 19:30:04 | 显示全部楼层 来自 北京
本帖最后由 bainhome 于 2010-10-29 21:05 编辑

我始终认为不麻烦——即使是回到原行列式或者循环相减,找索引编号的思想不会变:
  1. clc;clear;
  2. a=round(10*rand(4))
  3. b=round(10*rand(4))
  4. v=-a-b
  5. c=v(:)
  6. x=find(c==min(c))
  7. c1=floor(x/size(a,2))+1
  8. r1=mod(length(c),x);
  9. if r1==0
  10.     r1=size(a,1)
  11. else
  12.     r1=mod(length(c),x)
  13. end
复制代码
我的做法看起繁但思路简单,就是对变形后的列向量索引求余数和商。
回复 不支持

使用道具 举报

发表于 2010-10-29 20:25:12 | 显示全部楼层 来自 河北廊坊
  1. clear;clc;close all
  2. RandStream.setDefaultStream ...
  3.      (RandStream('mt19937ar','seed',sum(100*clock)));
  4. a=randi([-10,10],4,4);
  5. b=randi([-10,10],4,4);
  6. res=zeros(3,4);
  7. % res的每一行表示一种方法,第一列表示a的行,第二列表示a的列
  8. %                         第三列表示b的行,第四列表示b的列
  9. % 方法一
  10. [~,am]=max(a(:));
  11. [~,bm]=max(b(:));
  12. [res(1,1),res(1,2)]=ind2sub(size(a),am);
  13. [res(1,3),res(1,4)]=ind2sub(size(a),bm);
  14. % 方法二
  15. [c,d]=meshgrid(a(:),b(:));
  16. e=-c-d;
  17. [~,f]=min(e(:));
  18. [I,J]=ind2sub(size(c),f);
  19. [res(2,1),res(2,2)]=ind2sub(size(a),J);
  20. [res(2,3),res(2,4)]=ind2sub(size(a),I);
  21. % 方法三
  22. [g,h]=meshgrid(1:numel(a));
  23. p=-a(g)-b(h);
  24. [~,q]=min(p(:));
  25. [res(3,1),res(3,2)]=ind2sub(size(a),g(q));
  26. [res(3,3),res(3,4)]=ind2sub(size(a),h(q));
复制代码
不知道这次对不对,三种方法各有优劣,我对比我结果,是一致的

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-10-29 21:08:35 | 显示全部楼层 来自 北京
他的意思可能是形成两个1×16后,遍历相减,成为16×16矩阵,找最小数,以及其在原始矩阵中的位置,感觉直接用ind2sub也许不能得到最终效果。刚才出去逛,想到干脆回到最原始的地方,在遍历时就把下标标号存储起来,最后调用。
回复 不支持

使用道具 举报

发表于 2010-10-29 21:19:30 | 显示全部楼层 来自 湖北武汉
额,观望,我对matlab有恐惧感

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-10-29 22:08:45 | 显示全部楼层 来自 湖南湘潭
看不明白这个16×16的矩阵是怎么来的。怎么样“循环的相减,最后生成的-a(:)-b(:)矩阵是16*16”得到的呢?难得有热心人去揣测你的意思。“他的意思可能是形成两个1×16后,遍历相减,成为16×16矩阵,找最小数,以及其在原始矩阵中的位置”,太难为bainhome 了。
lz应该把意思表达更清楚一点。不应该有歧义。16×16的矩阵不大,直接把过程和数据粘上来。
回复 不支持

使用道具 举报

发表于 2010-10-29 23:30:27 | 显示全部楼层 来自 北京
本帖最后由 bainhome 于 2010-10-30 18:16 编辑
  1. function [Ind,T,CompareT]=t1x(a,b)
  2. % a和b必须是4×4的矩阵
  3. clc;
  4. % a=round(10*rand(4))
  5. % b=round(10*rand(4))
  6. a1=a(:);
  7. b1=b(:);
  8. IndRowA=repmat([1:4]',4,1);
  9. IndColA=sort(repmat([1:4]',4,1));
  10. IndRowB=IndRowA;
  11. IndColB=IndColA;
  12. for ii=1:16
  13.     for jj=1:16
  14.         Data(ii,jj,1)=IndRowA(ii);
  15.         Data(ii,jj,2)=IndColA(ii);
  16.         Data(ii,jj,3)=IndRowB(jj);
  17.         Data(ii,jj,4)=IndColB(jj);
  18.         Data(ii,jj,5)=-a1(ii)-b1(jj);
  19.     end
  20. end
  21. Data1=Data(:,:,5);
  22. [I,J]=find(Data1-min(min(Data1))<eps);
  23. for ii=1:length(I)
  24.     Ind(ii,:)=[Data(I(ii),J(ii),1),Data(I(ii),J(ii),2),Data(I(ii),J(ii),3),Data(I(ii),J(ii),4)];
  25.     T(ii,:)=[a(Data(I(ii),J(ii),1),Data(I(ii),J(ii),2)),b(Data(I(ii),J(ii),3),Data(I(ii),J(ii),4))];
  26. end
  27. Ind;                      %最小值原矩阵索引
  28. T;                        %最小值处a和b的数值
  29. CompareT=min(min(Data1)); % 最小值数值
复制代码
调用时command windows中输入:
  1. a=round(10*rand(4))
  2. b=round(10*rand(4))
  3. [Ind,T,CompareT]=t1x(a,b)
复制代码
答案:
  1. Ind =
  2. 1 3 4 1
  3. 2 3 4 1
  4. 4 3 4 1
  5. 1 4 4 1
  6. T =
  7. 10 10
  8. 10 10
  9. 10 10
  10. 10 10
  11. CompareT =
  12. -20
复制代码
总之,估计这就是正确答案之一,函数出入口都做好了,Ind中的顺序是:
ind_a_row,a_col,b_row,b_col]

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-29 23:58:51 | 显示全部楼层 来自 德国
不好意思,是我表述不够仔细,请各位大侠不要上火。感动的,大侠们揣测我的意思,还反复验证。我再研读一下。万分感谢!
回复 不支持

使用道具 举报

发表于 2010-10-30 01:32:30 | 显示全部楼层 来自 北京
你举个例子来说明你的意思是什么啊,比如第一个矩阵用1-16正整数,第二个矩阵用17-32正整数什么的
给大家演示一下你想要得到那个下标
回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-30 05:01:52 | 显示全部楼层 来自 德国
恩,我来举个例子,
a=[3 8 3 2;7 3 9 4;6 1 3 8;7 1 9 2];
b=[5 3 7 1;1 9 3 4;10 8 3 1;3 1 3 8];
[A,B] = meshgrid(a(:),b(:));
C = -A-B;   %C是16*16
minv=min(C(:));
minv=-9,
我要寻找到的不是-9在C中的行列位置,而是得出-9的某一个a(:),某一个b(:)在原来的a,b矩阵中各自的行列位置。
谢谢各位斑竹的关注!
回复 不支持

使用道具 举报

发表于 2010-10-30 10:14:20 | 显示全部楼层 来自 北京西城
13# Melvin1231
不知道你是否仔细看过我6#的程序,应该可以解决你的问题的
回复 不支持

使用道具 举报

发表于 2010-10-30 16:55:31 | 显示全部楼层 来自 北京
我10楼那个也可以哦
回复 不支持

使用道具 举报

发表于 2010-10-30 18:28:46 | 显示全部楼层 来自 湖南湘潭
恩,我来举个例子,
a=[3 8 3 2;7 3 9 4;6 1 3 8;7 1 9 2];
b=[5 3 7 1;1 9 3 4;10 8 3 1;3 1 3 8];
[A,B] = meshgrid(a(:),b(:));
C = -A-B;   %C是16*16
minv=min(C(:));
minv=-9,
我要寻找到的不是-9在C中 ...
Melvin1231 发表于 2010-10-30 05:01


minv = -19,不是-9!!!
  1. a = [ 3 8 3 2; 7 3 9 4; 6 1 3 8; 7 1 9 2 ];
  2. b = [ 5 3 7 1; 1 9 3 4; 10 8 3 1; 3 1 3 8 ];
  3. % 对a、b矩阵的大小不作要求。
  4. [ A, B ] = meshgrid(a, b);
  5. C = -A - B;
  6. [ cm, row ] = min(C);
  7. [ Cmin, Cyi ] = min(cm);
  8. Cxi = row(Cyi);
  9. [ axi, ayi ] = ind2sub(size(a), Cyi) % 在a矩阵中的位置
  10. [ bxi, byi ] = ind2sub(size(b), Cxi) % 在b矩阵中的位置
  11. Cmin
复制代码

axi =
     2
ayi =
     3
bxi =
     3
byi =
     1
Cmin =
   -19

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-10-31 17:13:49 | 显示全部楼层 来自 德国
谢谢楼上诸君,答案问题解决了:handshake
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-10-5 11:17 , Processed in 0.072248 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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