从MATLAB中的结构字段实例开始构建矩阵

时间:2018-07-12 21:01:37

标签: matlab matrix data-structures data-science

很抱歉打扰我,所以我希望这不是一个愚蠢或重复的问题。 我一直在抓取一个网站,将结果保存为MongoDB中的集合,将其导出为JSON文件并将其导入MATLAB中。 在故事的结尾,我获得了一个struct对象,该对象组织起来 like this one in the picture

我感兴趣的是最后两个单元格数组(可以使用string()轻松地转换为字符串数组)。第一个单元格数组是(认为唯一的产品)的集合,第二个单元格数组是(认为价格)的集合,例如字典。每个字段都是一组此键的可能值的实例(请考虑每日价格)。我的目标是建立一个像这样的矩阵

KEYS   VALUES_OF_FIELD_1   VALUES_OF_FIELD2   ...   VALUES_OF_FIELDn
A             x                   x                        x
B             x                   z                       NaN
C             z                   x                        y
D            NaN                  y                        x
E             y                   x                        z

主要问题是,如图所示,正如我试图在示例矩阵中说明的那样,我并不总是对每个字段中的所有键都有一个值(您可以看到有时它们是321,其他时间319或320或317),因此第一个数组缺少键。在这种情况下,我应该用NaN填充缺失值。键可以按字母顺序排列,并且都是唯一的。

您认为什么是在MATLAB中解决此问题的最佳,最可扩展的方法?

非常感谢您的宝贵时间,希望我能清楚地说明自己。

编辑: 就我而言,这两个数组都是由字符串组成的,因此类型不是问题(我已经修改了示例)。主要问题是,由于键在每个字段中都不同,因此我首先必须找到结构中的所有(唯一)键,以构建行,然后对于每个列(字段),我必须填写将NaN值钥匙丢失的地方。

2 个答案:

答案 0 :(得分:0)

要记住的一件事,您不能简单地在一个矩阵中同时使用字符串和数字。因此,如果将它们组合在一起,它们可以是全部字符串或全部数字。我认为所有字符串都对您有用。

在创建矩阵之前,请确保所有单元格都具有相同的元素。

new_matrix = horzcat(keys,values1,...valuesn); 

这将为每一行提供一个矩阵(根据您的图像)。现在,您可以使用for循环获取所有行的矩阵。

答案 1 :(得分:0)

现在,我已经通过将结构中最长的键数组视为完整的键集来解决它,我们称之为keys_set

然后我以这种方式为结构中的每个字段创建一个Map对象:

for i=1:length(structure)
    structure(i).myMap = containers.Map(structure(i).key_field, structure(i).value_field);
end

然后我通过对照M数组检查每个地图来构建矩阵(keys_set

for i=1:length(keys_set)
    for j=1:length(structure)
       if isKey(structure(j).myMap,char(keys_set(i)))
           M(i,j) = string(structure(j).myMap(char(keys_set(i))));
       else
           M(i,j) = string('MISSING');
       end
    end
end

这可行,但是最好能够检查keys_set是否真的完整。

编辑:我已经通过using this function解决了我的问题,并建立了所有可能键的正确集合:

%% Finding the maximum number of keys in all the fields
maxnk = length(structure(1).key_field);
for i=2:length(structure)
    if length(structure(i).key_field) > maxnk
        maxnk = length(structure(i).key_field);
    end
end

%% Initialiting the matrix containing all the possibile set of keys
keys_set=string(zeros(maxnk,length(structure)));

%% Filling the matrix by putting "0" if the dimension is smaller
for i=1:length(structure)
    d = length(string(structure(i).key_field));
    if  d == maxnk
        keys_set(:,i) = string(structure(i).key_field);
    else
        clear tmp
        tmp = [string(structure(i).key_field); string(zeros(maxnk-d,1))];
        keys_set(:,i) = tmp;
    end
end

%% Merging without duplication and removing the "0" element
keys_set = union_several(keys_set);
keys_set = keys_set(keys_set ~= string(0));