2012-11-09 165 views
0

我有一個MinCUT算法在matlab中。這是一個功能!我如何從我的郵件文件中調用它! 我是否必須定義所有變量?還是我必須定義輸入?在matlab中調用函數

function [MinCutGroupsList, MinCutWeight] = MinCut(SourceNodes, WeightedGraph) 
%%% performs Min Cut algorithm described in "A Simple Min Cut Algorithm" by 
%%% M. Stoer and F. Wagner. 

%%% input - 
%%%  SourceNodes - a list of Nodes that are forced to be kept in one side of the cut. 
%%%  WeightedGraph - symetric matrix of edge weights. Wi,j is the edge connecting Nodes i,j 
%%%      use Wi,j=0 or Wi,j == inf to indicate unconnected Nodes. 
%%% output - 
%%% MinCutGroupsList - two lists of verices, SECOND one contains the sourve vertives 
%%% MinCutWeight - sum of weight of edges alosng the cut 

    GraphDim = size(WeightedGraph,1); 
    SourceNodes = SourceNodes(SourceNodes ~= 0); %remove zero Nodes 

    %%% remove self edges and ZEROed ones 
    WeightedGraph = WeightedGraph+diag(inf(1,GraphDim)); 
    % for ii = 1:GraphDim 
    %  WeightedGraph(ii,ii) = inf; 
    % end 
    WeightedGraph(WeightedGraph == 0) = inf; 

    %%%Merge all Source Vrtices to one, so they'll be unbreakable, descending order is VITAL!!! 
    SourceNodes = sort(SourceNodes); 
    GroupsList = zeros(GraphDim); %each row are the Nodes melted into one vertex in the table. 
    GroupsList(:,1) = 1:GraphDim; 
    for ii=length(SourceNodes):-1:2; 
     [WeightedGraph,GroupsList] = MeltTwoNodes(SourceNodes(1),SourceNodes(ii),WeightedGraph,GroupsList); 
    end 
    Split = GroupsList(:,1); 

    %%% By now I have a weighted graph in which all seed Nodes are 
    %%% merged into one vertex. Run Mincut algrithm on this graph 
    [MinCutGroupsList_L, MinCutWeight] = MinCutNoSeed(WeightedGraph); 

    %%% Convert Data so the seed Nodes will be reconsidered as different 
    %%% Nodes and not one vertex. 
    for ii = 1:2 
     MinCutGroupsList(ii,:) = Local2GlobalIndices(MinCutGroupsList_L(ii,:), Split); 
    end 

    if (length(find(MinCutGroupsList(1,:) == SourceNodes(1))) == 1) 
     SeedLocation = 1; 
    else 
     SeedLocation = 2; 
    end 
    MinCutGroupsList_withSeed = [MinCutGroupsList(SeedLocation,(MinCutGroupsList(SeedLocation,:)~=0)) SourceNodes(2:length(SourceNodes))]; 
    MinCutGroupsList_withSeed = sort(MinCutGroupsList_withSeed); 
    MinCutGroupsList_withSeed = [MinCutGroupsList_withSeed zeros(1,GraphDim - length(MinCutGroupsList_withSeed))]; 

    MinCutGroupsList_NoSeed = MinCutGroupsList(3 - SeedLocation,(MinCutGroupsList(3 - SeedLocation,:)~=0)); 
    MinCutGroupsList_NoSeed = sort(MinCutGroupsList_NoSeed); 
    MinCutGroupsList_NoSeed = [MinCutGroupsList_NoSeed zeros(1,GraphDim - length(MinCutGroupsList_NoSeed))]; 

    MinCutGroupsList = [MinCutGroupsList_NoSeed ; MinCutGroupsList_withSeed]; 

return 

回答

1

把函數定義在一個名爲MinCut.m文件,該文件必須在當前的MATLAB的路徑(例如,您的當前工​​作目錄)。

然後你就可以調用函數編寫

[MinCutGroupsList, MinCutWeight] = MinCut(yourSourceNodes, yourWeightedGraph); 

this answer (Matlab: Calling user defined function)考慮。

0

你可以這樣調用:

MinCut(SourceNodes, WeightedGraph) 

,或者如果你想收集輸出

[MinCutGroupsList, MinCutWeight] = MinCut(SourceNodes, WeightedGraph)