Melvin1231 发表于 2010-10-29 17:24:18

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

本帖最后由 Melvin1231 于 2010-10-29 17:26 编辑

请各位帮忙看看,导师催促,我已经焦头烂额了。谢谢!
两个从excel导入的矩阵a和b, 各是4*4的,在满足取到min(-a(:)-b(:))的条件下,如何返回寻找到这时的a(:)和b(:)在各自4*4矩阵中的位置呢?find函数貌似只能针对满足单一矩阵的某一条件,比如极值下,返回在矩阵中的位置。

qibbxxt 发表于 2010-10-29 17:38:34

>> a=rand(4)

a =

    0.8147    0.6324    0.9575    0.9572
    0.9058    0.0975    0.9649    0.4854
    0.1270    0.2785    0.1576    0.8003
    0.9134    0.5469    0.9706    0.1419

>> b=rand(4)

b =

    0.4218    0.6557    0.6787    0.6555
    0.9157    0.0357    0.7577    0.1712
    0.7922    0.8491    0.7431    0.7060
    0.9595    0.9340    0.3922    0.0318

>> c=-a-b

c =

   -1.2365   -1.2881   -1.6362   -1.6126
   -1.8215   -0.1333   -1.7226   -0.6566
   -0.9192   -1.1276   -0.9007   -1.5063
   -1.8729   -1.4809   -1.3628   -0.1737

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

e =

   4

>> = ind2sub(size(c),e)

I =

   4


J =

   1不知道你是不是要这个结果

lin2009 发表于 2010-10-29 17:57:35

多看看函数本身的帮助文件,Matlab提供的功能有时比我们想象的要多。
如min、max等本身就可以直接返回位置信息的。

Melvin1231 发表于 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,但是没有找到针对性的信息。

bainhome 发表于 2010-10-29 19:30:04

本帖最后由 bainhome 于 2010-10-29 21:05 编辑

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

qibbxxt 发表于 2010-10-29 20:25:12

clear;clc;close all
RandStream.setDefaultStream ...
   (RandStream('mt19937ar','seed',sum(100*clock)));
a=randi([-10,10],4,4);
b=randi([-10,10],4,4);
res=zeros(3,4);
% res的每一行表示一种方法,第一列表示a的行,第二列表示a的列
%                         第三列表示b的行,第四列表示b的列
% 方法一
[~,am]=max(a(:));
[~,bm]=max(b(:));
=ind2sub(size(a),am);
=ind2sub(size(a),bm);
% 方法二
=meshgrid(a(:),b(:));
e=-c-d;
[~,f]=min(e(:));
=ind2sub(size(c),f);
=ind2sub(size(a),J);
=ind2sub(size(a),I);
% 方法三
=meshgrid(1:numel(a));
p=-a(g)-b(h);
[~,q]=min(p(:));
=ind2sub(size(a),g(q));
=ind2sub(size(a),h(q));不知道这次对不对,三种方法各有优劣,我对比我结果,是一致的

bainhome 发表于 2010-10-29 21:08:35

他的意思可能是形成两个1×16后,遍历相减,成为16×16矩阵,找最小数,以及其在原始矩阵中的位置,感觉直接用ind2sub也许不能得到最终效果。刚才出去逛,想到干脆回到最原始的地方,在遍历时就把下标标号存储起来,最后调用。

defantasy 发表于 2010-10-29 21:19:30

额,观望,我对matlab有恐惧感

lin2009 发表于 2010-10-29 22:08:45

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

bainhome 发表于 2010-10-29 23:30:27

本帖最后由 bainhome 于 2010-10-30 18:16 编辑

function =t1x(a,b)
% a和b必须是4×4的矩阵
clc;
% a=round(10*rand(4))
% b=round(10*rand(4))
a1=a(:);
b1=b(:);
IndRowA=repmat(',4,1);
IndColA=sort(repmat(',4,1));
IndRowB=IndRowA;
IndColB=IndColA;
for ii=1:16
    for jj=1:16
      Data(ii,jj,1)=IndRowA(ii);
      Data(ii,jj,2)=IndColA(ii);
      Data(ii,jj,3)=IndRowB(jj);
      Data(ii,jj,4)=IndColB(jj);
      Data(ii,jj,5)=-a1(ii)-b1(jj);
    end
end
Data1=Data(:,:,5);
=find(Data1-min(min(Data1))<eps);
for ii=1:length(I)
    Ind(ii,:)=;
    T(ii,:)=;
end
Ind;                      %最小值原矩阵索引
T;                        %最小值处a和b的数值
CompareT=min(min(Data1)); % 最小值数值调用时command windows中输入:a=round(10*rand(4))
b=round(10*rand(4))
=t1x(a,b)答案:Ind =
1 3 4 1
2 3 4 1
4 3 4 1
1 4 4 1
T =
10 10
10 10
10 10
10 10
CompareT =
-20
总之,估计这就是正确答案之一,函数出入口都做好了,Ind中的顺序是:
ind_a_row,a_col,b_row,b_col]

Melvin1231 发表于 2010-10-29 23:58:51

不好意思,是我表述不够仔细,请各位大侠不要上火。感动的,大侠们揣测我的意思,还反复验证。我再研读一下。万分感谢!

feynmand 发表于 2010-10-30 01:32:30

你举个例子来说明你的意思是什么啊,比如第一个矩阵用1-16正整数,第二个矩阵用17-32正整数什么的
给大家演示一下你想要得到那个下标

Melvin1231 发表于 2010-10-30 05:01:52

恩,我来举个例子,
a=;
b=;
= meshgrid(a(:),b(:));
C = -A-B;   %C是16*16
minv=min(C(:));
minv=-9,
我要寻找到的不是-9在C中的行列位置,而是得出-9的某一个a(:),某一个b(:)在原来的a,b矩阵中各自的行列位置。
谢谢各位斑竹的关注!

qibbxxt 发表于 2010-10-30 10:14:20

13# Melvin1231
不知道你是否仔细看过我6#的程序,应该可以解决你的问题的

bainhome 发表于 2010-10-30 16:55:31

我10楼那个也可以哦

lin2009 发表于 2010-10-30 18:28:46

恩,我来举个例子,
a=;
b=;
= meshgrid(a(:),b(:));
C = -A-B;   %C是16*16
minv=min(C(:));
minv=-9,
我要寻找到的不是-9在C中 ...
Melvin1231 发表于 2010-10-30 05:01 http://forum.simwe.com/images/common/back.gif

minv = -19,不是-9!!!
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矩阵的大小不作要求。
[ A, B ] = meshgrid(a, b);
C = -A - B;
[ cm, row ] = min(C);
[ Cmin, Cyi ] = min(cm);
Cxi = row(Cyi);
[ axi, ayi ] = ind2sub(size(a), Cyi) % 在a矩阵中的位置
[ bxi, byi ] = ind2sub(size(b), Cxi) % 在b矩阵中的位置
Cmin
axi =
   2
ayi =
   3
bxi =
   3
byi =
   1
Cmin =
   -19

Melvin1231 发表于 2010-10-31 17:13:49

谢谢楼上诸君,答案问题解决了:handshake
页: [1]
查看完整版本: 请教find函数在多矩阵关联中的寻址问题