MATLAB:网络具有共同的价值,如何将它们分组?

时间:2019-04-29 09:13:09

标签: matlab

我正在做一个项目,在分离值时遇到问题。

说明:我有一个矩阵,其中包含X列和X行。 通常,这是矩阵的示例,其中列是网络。

a =

 1     2     2     1
 2     3     5    12
 0     4     6    13
 0     5     7    14
 0     6     8    15
 0     0     9    16
 0     0     0    17
 0     0     0    18
 0     0     0    19
 0     0     0    20
 0     0     0    21
 0     0     0    22

每个网络都有许多载具,有时有两个或三个网络具有普通载具。

我的问题是:如何根据以下规则将它们分为不同的组。

  • 如果两个网络具有相同的价值,请将它们分成两组,
  • 如果两个网络的价值不相同,请将它们重新分组为一个组,
  • 例如,如果一个网络与另一个网络没有共同价值,则将其添加到组1中,而不是添加到组2中(根据规则2)。 如果一个网络与另一个网络具有共同的价值,则将其放在不包含任何具有共同价值的网络的第一组中(根据规则1)。
  • 我接受有关第一个规则的答案,但目标是拥有平衡的群体。

我尝试了很多方法来解决这个问题。

此代码使我能够找到各列之间的通用值:

lastColumn = nbNetworks_5; % = 4 in my example

for i = 1 : lastColumn

    for columnIndex = 1 : lastColumn

        if lastColumn == 1 
           % do nothing.

        elseif columnIndex ==  lastColumn 
           % do nothing.

        else
            [CommonValue,posInCln1,posInCln2] = intersect(a(:,columnIndex), a(:, lastColumn))

            % If there is a common value
            if CommonValue ~= 0
                regroup = false;

            else % If there is no common value
                regroup = true;

            end
        end
    end

    % Decrease the max number of columns.
    % We start from the end to get to the beginning.
    lastColumn = lastColumn - 1

end

这是我的代码:

我将第一列与最后一列进行比较,然后将第二列与最后一列进行比较,然后将第三列与最后一列进行比较。 然后我向后移一列。.etc

我不知道如何分离和放置这些网络。

因此,这就是我最终希望得到的结果:

  

group1 具有 network1

     

group2 具有 network2 network4

     

group3 具有 network3

     

创建的组数:3

为此:

  

network1进入了group1,与所有网络相交

     

network2进入了group2,-与Network3相交

     

network3进入了group3,

     

网络4进入了分组2。

感谢您为我的问题付出的宝贵时间!

卡恩

1 个答案:

答案 0 :(得分:1)

我有一个解决方案,但是很不幸,因为它更短,所以很难理解。

首先,您按原样定义数据。矩阵a是您提供的。命令size(a,2)给出a中的列数。然后,创建一个向量,稍后将确定每个组的编号。现在我们以零表示我们尚未找到这些组。 zeros(1,lastColumn)将创建[0 0 0 0]。

a= [1     2     2     1
 2     3     5    12
 0     4     6    13
 0     5     7    14
 0     6     8    15
 0     0     9    16
 0     0     0    17
 0     0     0    18
 0     0     0    19
 0     0     0    20
 0     0     0    21
 0     0     0    22];

lastColumn = size(a,2); %amount of columns
group=zeros(1,lastColumn);

这样的循环框架很简单:我们从for循环的第一列开始,一直循环到最后一列。然后,我们从第一组(current_gourp = 1)开始,检查当前列是否具有来自当前组的任何值。如果该组确实有一个值,我们将检查下一个组,如果该组确实有该值(因为该值不存在或该组到目前为止是空的),我们将current_group设置为{ {1}}。困难的部分是如何检查它,我将在代码下方进行解释。

current_column

通过Matlab帮助您获得:

  数组A和B的

ismember(A,B)返回相同数组       大小为A,包含true,其中A的元素位于B中,而false       否则。

因此for current_column = 1 : lastColumn current_group = 1; while any(ismember(a(:,current_column),a(:,group==current_group)) & a(:,current_column)>0) current_group = current_group +1; end group(current_column) = current_group; end disp(['Total amount of groups: ' int2str(max(group))]); disp(['The groups are ' int2str(group)]); size_of_group=zeros(1,lastColumn); for current_group=1:max(group) size_of_group(current_group) = sum(group==current_group); disp(['Group ' int2str(current_group) ' contains ' int2str(sum(group==current_group))]); end 可能仍然有效,但这似乎更合适。使用intersect,您可以获得某个组中的所有列,或者如果该组到目前为止没有成员,则什么都没有(在循环之前和循环之后尝试group==current_gourp)。由于两个组都可能包含零,因此第二部分group==2检查值是否大于0。仅当两个值都为true时,当前组中当前列的elemnt且值大于0时,该值才为true 。围绕该a(:,current_column)>0命令检查当前列是否足以跳过该组的情况是否成立。

我希望这对您有帮助