我正在做一个项目,在分离值时遇到问题。
说明:我有一个矩阵,其中包含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
每个网络都有许多载具,有时有两个或三个网络具有普通载具。
我的问题是:如何根据以下规则将它们分为不同的组。
我尝试了很多方法来解决这个问题。
此代码使我能够找到各列之间的通用值:
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。
感谢您为我的问题付出的宝贵时间!
卡恩
答案 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
命令检查当前列是否足以跳过该组的情况是否成立。
我希望这对您有帮助