【问题标题】:Need to create a matrix with a specific selection of elements需要创建一个包含特定元素选择的矩阵
【发布时间】:2015-10-28 16:33:09
【问题描述】:

我收到以下信息:

其中“routenummer”代表道路编号,“gemeente”代表城市,“afstand”代表距离(公里),“moeilijkheidsgraad”代表难度。

我需要创建一个名为 hardRoads 的矩阵,其中包含难度低于 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

提前致谢!

【问题讨论】:

    标签: matlab for-loop matrix control-structure


    【解决方案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) &lt; 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  
    

    【讨论】:

    • 谢谢!它可以解决问题,但我还需要在第二列中包含城市。有什么想法吗?
    • 很好的答案!非常感谢您的帮助。
    • @Nicolas 完全没问题 :) 顺便说一句,我已经把答案做得更好了。我已经为表格中的每一列包含了原始图块。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多