文件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 编辑]