很抱歉打扰我,所以我希望这不是一个愚蠢或重复的问题。
我一直在抓取一个网站,将结果保存为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值钥匙丢失的地方。
答案 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));