需要创建具有特定元素选择的矩阵

时间:2015-10-28 16:33:10

标签: matlab for-loop matrix control-structure

我收到以下信息:

Matrix with given information

其中“routenummer”代表roadnumber,“gemeente”代表城市,“afstand”代表距离以km为单位,“moeilijkheidsgraad”代表难度。

我需要创建一个名为difficultyRoads的矩阵,其中包含难度低于3的步行道路的所有给定信息。为了制作这个特定的矩阵,我需要使用矩阵路径(我在我的代码中制作并包含原始矩阵没有关于城市的信息)。

n = 0;

nr = [1; 2; 3; 4; 5; 6; 7; 8]
afst = [13; 13; 9.5; 4.5; 11; 12; 16; 8]
gr = [1; 3; 2; 2; 3; 3; 3; 2] 

routes = zeros(8, 3);
routes(:,1) = nr;
routes(:,2) = afst;
routes(:,3) = gr;

routes
for r = 1:8
    if routes(r,2) > 10 
        n = n + 1;
    end
end
for r = 1:8
    sel= (routes(r,3) < 3)
    % I have no clue on what to do here, gr(sel) 
    % doesn't seem to work and I have no idea how 
    % I could turn it into a matrix aswell with 
    % only the extra information of the required roads.
end        
disp(['The number of roads with a distance bigger than 10 km is ' num2str(n)])

如您所见,我还创建了向量nr,afst,gr和矩阵路径。这是作业的另一部分,可以忽略。

当运行时,应该像这样形成矩阵

1          Merelbeke            13         1
3          Kluisbergen          9.5        2
4          Kruishoutem          4.5        2
8          Oudenaarde           8          2

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你需要这个矩阵的一个子集,它列出了所有难度小于3的道路。可以简单地通过以下方式完成:

difficultRoads = routes(routes(:,3) < 3, :);

顺便说一句,如果我可以用您的代码发表一条评论,您只需执行以下操作即可创建该矩阵:

nr = [1; 2; 3; 4; 5; 6; 7; 8]
afst = [13; 13; 9.5; 4.5; 11; 12; 16; 8]
gr = [1; 3; 2; 2; 3; 3; 3; 2]     

routes = [nr afst gt];

此处无需预先分配并自行填充每列。只需通过水平堆叠列来创建矩阵。

回到原来的问题,这会使用所谓的logical indexing。基本上,我们会查看routes的最后一列,并确定所有小于3的难度。这由routes(:,3) < 3完成。这会产生一个逻辑矩阵,其中true / 1满足条件而false / 0不满足条件。然后,您将使用此矩阵访问矩阵routes的行,并提取满足条件的行,从而获得该结果。

但是,你所写的只是数字数据。你也想展示城市。

我们可以创建table结构来帮助我们实现这一目标,但首先,您需要定义尚未完成的城市。

%// Your data + the cities
nr = [1; 2; 3; 4; 5; 6; 7; 8]
afst = [13; 13; 9.5; 4.5; 11; 12; 16; 8]
gr = [1; 3; 2; 2; 3; 3; 3; 2]     

routes = [nr afst gt];
cities = {'Merelbeke', 'Oudenaarde', 'Kluisbergen', 'Kruishoutem', 'Maarkedal', 'Maarkdeal', 'Luisbergen', 'Oudernaarde'}.';

一旦你这样做,就形成一张桌子:

T = table(nr, cities, afst, gr, 'VariableNames', {'Routenummer', 'Gemeente', 'Afstand', 'Moeilijkheidsgraad'});

请注意,我也给每一列都有自己的名字,因为如果你不这样做,它只是默认调用变量名称。

我们得到:

T = 

    Routenummer      Gemeente       Afstand    Moeilijkheidsgraad
    ___________    _____________    _______    __________________

    1              'Merelbeke'       13        1                 
    2              'Oudenaarde'      13        3                 
    3              'Kluisbergen'    9.5        2                 
    4              'Kruishoutem'    4.5        2                 
    5              'Maarkedal'       11        3                 
    6              'Maarkdeal'       12        3                 
    7              'Luisbergen'      16        3                 
    8              'Oudernaarde'      8        2     

现在您已经拥有了这个,请转而使用此表:

difficultRoads = T(routes(:,3) < 3, :);

我们得到:

difficultRoads = 

    Routenummer      Gemeente       Afstand    Moeilijkheidsgraad
    ___________    _____________    _______    __________________

    1              'Merelbeke'       13        1                 
    3              'Kluisbergen'    9.5        2                 
    4              'Kruishoutem'    4.5        2                 
    8              'Oudernaarde'      8        2