请教find函数在多矩阵关联中的寻址问题
本帖最后由 Melvin1231 于 2010-10-29 17:26 编辑请各位帮忙看看,导师催促,我已经焦头烂额了。谢谢!
两个从excel导入的矩阵a和b, 各是4*4的,在满足取到min(-a(:)-b(:))的条件下,如何返回寻找到这时的a(:)和b(:)在各自4*4矩阵中的位置呢?find函数貌似只能针对满足单一矩阵的某一条件,比如极值下,返回在矩阵中的位置。 >> 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不知道你是不是要这个结果 多看看函数本身的帮助文件,Matlab提供的功能有时比我们想象的要多。
如min、max等本身就可以直接返回位置信息的。 感谢斑竹大人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 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我的做法看起繁但思路简单,就是对变形后的列向量索引求余数和商。 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));不知道这次对不对,三种方法各有优劣,我对比我结果,是一致的 他的意思可能是形成两个1×16后,遍历相减,成为16×16矩阵,找最小数,以及其在原始矩阵中的位置,感觉直接用ind2sub也许不能得到最终效果。刚才出去逛,想到干脆回到最原始的地方,在遍历时就把下标标号存储起来,最后调用。 额,观望,我对matlab有恐惧感 看不明白这个16×16的矩阵是怎么来的。怎么样“循环的相减,最后生成的-a(:)-b(:)矩阵是16*16”得到的呢?难得有热心人去揣测你的意思。“他的意思可能是形成两个1×16后,遍历相减,成为16×16矩阵,找最小数,以及其在原始矩阵中的位置”,太难为bainhome 了。
lz应该把意思表达更清楚一点。不应该有歧义。16×16的矩阵不大,直接把过程和数据粘上来。 本帖最后由 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] 不好意思,是我表述不够仔细,请各位大侠不要上火。感动的,大侠们揣测我的意思,还反复验证。我再研读一下。万分感谢! 你举个例子来说明你的意思是什么啊,比如第一个矩阵用1-16正整数,第二个矩阵用17-32正整数什么的
给大家演示一下你想要得到那个下标 恩,我来举个例子,
a=;
b=;
= meshgrid(a(:),b(:));
C = -A-B; %C是16*16
minv=min(C(:));
minv=-9,
我要寻找到的不是-9在C中的行列位置,而是得出-9的某一个a(:),某一个b(:)在原来的a,b矩阵中各自的行列位置。
谢谢各位斑竹的关注! 13# Melvin1231
不知道你是否仔细看过我6#的程序,应该可以解决你的问题的 我10楼那个也可以哦 恩,我来举个例子,
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 谢谢楼上诸君,答案问题解决了:handshake
页:
[1]