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

Build a matrix starting from instances of structure fields in MATLAB

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

我感兴趣的是最后两个元胞数组(可以使用 string() 轻松转换为字符串数组)。第一个元胞数组是 keys 的集合(想想独特的产品),第二个元胞数组是 values 的集合(想想价格),比如一本字典。每个字段都是一组 this 键的可能值的实例(想想每日价格)。我的目标是构建一个 矩阵 ,如下所示:

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钥匙丢失的地方。

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

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

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

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

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

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

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

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

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));