【问题标题】:How do I represent and access elements of this multivalued data structure?如何表示和访问这个多值数据结构的元素?
【发布时间】:2017-08-16 01:11:39
【问题描述】:

我正在尝试实现Brooks-Iyengar algorithm 用于传感器融合,并尝试在 MATLAB 中表示以下数据结构。

A = {([1.5,3.2],4), ([0,2.7],5), ([0.8,2.8],4)}

我尝试了以下操作

B = {{[1.5,3.2],4},{[0,2.7],5}}

但是我不知道如何访问每个元素,即1.53.24 以及下一组值。我从B{1} 获得了一组元素,但之后无法获得各个值。

任何想法或指向适当链接的指针都会有所帮助。

【问题讨论】:

    标签: matlab data-structures cell-array matrix-indexing heterogeneous-array


    【解决方案1】:

    使用当前结构,您可以简单地继续索引:

    >> B{1}
    
    ans = 
    
        [1x2 double]    [4]
    
    >> B{1}{1}
    
    ans =
    
        1.5000    3.2000
    
    >> B{1}{1}(2)
    
    ans =
    
        3.2000
    
    >> B{1}{2}
    
    ans =
    
         4
    

    要从主结构中删除一个项目,您可以使用以下语法B(1) = [];

    >> B = {{[1.5,3.2],4},{[0,2.7],5}}
    
    B = 
    
        {1x2 cell}    {1x2 cell}
    
    >> B(1) = []
    
    B = 
    
        {1x2 cell}
    
    >> B{1}
    
    ans = 
    
        [1x2 double]    [5]
    
    >> 
    

    您还可以选择以structure array 表示数据(使用更好的属性命名):

    >> s = struct('prop1',{4, 5},'prop2', {[1.5,3.2], [0,2.7]})
    
    s = 
    
    1x2 struct array with fields:
    
        prop1
        prop2
    
    >> s(1).prop1
    
    ans =
    
         4
    
    >> s(1).prop2
    
    ans =
    
        1.5000    3.2000
    
    >> s(1).prop2(2)
    
    ans =
    
        3.2000
    

    要删除一个项目,您可以使用类似的语法:

    s(1) = []
    

    如果您想对数据元素执行一些操作,您也可以选择使用 OOP 方法,并创建一个表示单个数据元素的类,也可以创建一个表示整个数据集的类。访问数据成员是很自然的。

    【讨论】:

    • 看起来不错。只是一个后续问题,我将如何从第一个结构中删除数据条目(例如 {[1.5,3.2],4} )?
    • 更新了关于如何使用原始或结构数组方法删除元素的答案。
    • 但是当我做 B{1} = [] 时,单元格的大小并没有减小。它有一个空条目。有什么方法可以删除那个空集吗?
    • B{1} = []B(1) = [] 不同。第一个分配一个空条目,第二个将删除该条目。
    【解决方案2】:

    如果您的 MATLAB 版本足够新(即 >= R2013b),您可以为此使用 table

    A = table([1.5,3.2; 0,2.7; 0.8,2.8],[4; 5; 4],'VariableNames',{'name1','name2'});
    

    如您所见,结果易于检查(视觉)且易于访问:

    A.name1(3,2) % is 2.8000
    

    【讨论】:

      【解决方案3】:

      如果您对使用单元格不满意,那么我会从 cell2mat 开始,看看是否有帮助。

        vals = cell2mat(B{2}) % returns the array vals=[0 2.7 5]
      

      您也可以从一开始就简单地将数据用作普通矩阵:

       B = [ 1.5, 3.2, 4; 0, 2.7, 5];
      

      然后使用第 3 列作为您的键,如果这是您的意图(并且它们是数字)。如果键不能保证是数字的,那么结构可能会很有用。

      编辑:我认为 DVarga 给出了更详细和有用的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        相关资源
        最近更新 更多