matlab矩阵之间比大小,两个矩阵每行之间比较

该博客介绍了一种在MATLAB中比较两个矩阵大小的算法,即使矩阵的行数和列数不同也能处理。通过将大矩阵分割成小块并逐行比较,最后组合结果。博主分享了主函数main及其辅助函数GetSubRowInd和MatCompare的详细代码,并解释了每个函数的作用和调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件main.m

%--------------------------------------------------------------------------------

% 算法思路:

% 你原来的要求是A和B的尺寸相同,我做了扩展,A和B的行数和列数都可以不同

% 当A和B其中有一个或者2个的尺寸过大时,MATLAB分配变量内存的时候很可能失败。

% 但是可以改进算法,将A或B分割成相对较小的矩阵然后在调用写好的函数。

% 假设A按行分割成4份,B按行分割成3份,则

% 矩阵A = [ A1        矩阵B = [ B1

%              A2                      B2

%              A3                      B3 ]

%              A4 ]

% 具体的分割方法是Ai =  A(indRowA(1,i):indRowA(2,i),:)

%                 Bj =  B(indRowB(1,j):indRowB(2,j),:)

% 而函数MatCompare(A,B)按行比较矩阵A和B返回cell数组

% 所以只要反复调用

%        [ MatCompare(A1,B1),MatCompare(A1,B2),MatCompare(A1,B3)

%          MatCompare(A2,B1),MatCompare(A2,B2),MatCompare(A2,B3)

%          MatCompare(A3,B1),MatCompare(A3,B2),MatCompare(A3,B3)

%          MatCompare(A4,B1),MatCompare(A4,B2),MatCompare(A4,B3) ]

% 然后将结果记入

% SubS = [ SubS(1,1),SubS(1,2),SubS(1,3)

%          SubS(2,1),SubS(2,2),SubS(2,3)

%          SubS(3,1),SubS(3,2),SubS(3,3) ]

% 即可

% 此时SubS{i,j}{m,n}的值就代表Ai的第m行与Bj的第n行的交集

%

%

% 看懂本程序必备的MATLAB知识:

% 1. function handle  函数句柄 又称 匿名函数

% 2. cell array       元胞数组,细胞数组,本人倾向翻译为"单元阵列"

% 3. Matrix index     矩阵索引的方法

% 4. matlab function  MATLAB中多函数的编写和调用方法

%

% 调用本函数的方法:

% 命令行或者另起M脚本输入以下命令

% A =

% B =

% S = main(A,B)

% 返回值S{i,j}{m,n}代表Ai矩阵和Bj的交集向量

%

% Author : Neptune_zx%   Time : 2011/11/2

% 好好学习,论坛需要你们

%--------------------------------------------------------------------------%-------------------------- Main Function ---------------------------------

function result = main(A,B)

rowsA = size(A,1);

rowsB = size(B,1);

% 矩阵A和B如果太大,则按行分割成divNum份

divNumA = 4;

divNumB = 4;

indRowA = GetSubRowInd(A,divNumA);

indRowB = GetSubRowInd(B,divNumB);

S = cell(rowsA,rowsB);

[IndA IndB] = meshgrid(1:rowsB,1:rowsA);

%A(indRowA(1,i):indRowA(2,i),:)表示A的第i个子矩阵,B同理

SubCmpHandle = @(i,j){MatCompare(A(indRowA(1,i):indRowA(2,i),:),...

B(indRowB(1,j):indRowB(2,j),:))};

SubS = arrayfun(SubCmpHandle,IndA,IndB);

end%---------------------- SubFunction GetSubRowInd ----------------------

function indRow = GetSubRowInd(M,divNum)

% GetSubRowInd 获取矩阵M按行进行divNum份分割后,各子矩阵的行索引

rowsM = size(M,1);

lenSub = round(rowsM/divNum);

indRow = [ [0 : divNum-1]*lenSub + 1;

[1 : divNum-1]*lenSub, rowsM ];

end%----------------------- SubFunction MatCompare -----------------------

function cellS = MatCompare(A,B)

% MatCompare 按行比较A和B,返回cell数组

CmpFcnHandle = @(i,j)RowsCompare(A,B,i,j);

[I J] = meshgrid(1:size(B,1),1:size(A,1))

cellS = arrayfun(CmpFcnHandle,I,J,'UniformOutput', false)

end%----------------------- SubFunction RowsCompare ----------------------

function interSet = RowsCompare(A,B,i,j)

% RowsCompare(A,B,i,j) 比较矩阵A的第i行与B的第j行,

% 返回两行的交集,若交集元素多于2个则返回子字符串"more"

interSet = intersect(A(i,:),B(j,:));

if (length(interSet(:))>2)

interSet = 'more';

end

end

程序未运行测试过,也许会有语义上的错误,但是思路是清晰的。

[本帖最后由 Neptune_zx 于 2011-11-2 18:22 编辑]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值