我遇到了使用容器的问题.matlab的地图.
这是我的问题的一个例子:
当我尝试构建一个myClass实例数组的映射时,键的cellarray定义为:
valueSet = myClass.empty(4,0);
keySet = cell(1,4);
for i=1:4
valueSet(i) = myClass();
keySet{i} = valueSet(i).name;
end
map = containers.Map(keySet, valueSet);
Run Code Online (Sandbox Code Playgroud)
同
classdef myClass < handle
properties
name;
end
methods
function self = myClass()
self.name = randstr(10);
end
function output = randstr(n)
symbols = ['a':'z' 'A':'Z' '0':'9'];
nums = randi(numel(symbols),[1 n]);
output = symbols (nums);
end
end
end
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error using containers.Map
Specified value type does not match the type expected for this container.
Run Code Online (Sandbox Code Playgroud)
但是matlab文档说:
mapObj = containers.Map(keySet,valueSet)构造一个Map,其中包含一个或多个值以及每个值的唯一键.
keySet 1-by-n数组,指定映射的n个唯一键.如果n> 1并且键是字符串,则keySet必须是单元格数组.
valueSet:任意类的 1-by-n数组,指定映射的n个值.valueSet中的值的数量必须等于keySet中的键数.
我也尝试指定类类型,但它也引发了一个错误:
containers.Map('KeyType','char', 'ValueType','myClass')
Error using containers.Map
Unsupported ValueType 'myClass' specified. See documentation for valid value types.
Run Code Online (Sandbox Code Playgroud)
所以我不明白......如果containers.Map适用于任何类,为什么不能为myClass工作?
如果你这样做
help containers.Map
Run Code Online (Sandbox Code Playgroud)
你得到一个部分说
vType的有效值是字符串:
'char', 'double', 'single',
'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64',
'uint64', 'logical',
或'any'
.键类型和值类型参数的顺序并不重要,但必须同时提供它们.
你可以使用:
containers.Map('KeyType','char', 'ValueType','any')
Run Code Online (Sandbox Code Playgroud)
但是,您可能需要的行为是:
myMap = containers.Map(keySet, num2cell(valueSet))
Run Code Online (Sandbox Code Playgroud)
当你输入正确的密钥时,这会给你一个myClass类型的对象.这很可能是因为containers.Map
期望自定义对象的单元数组而不是对象数组.
你的代码看起来会更清晰:
valueSet = cell(1,4);
keySet = cell(1,4);
for i=1:4
valueSet{i} = myClass();
keySet{i} = valueSet{i}.name;
end
map = containers.Map(keySet, valueSet);
Run Code Online (Sandbox Code Playgroud)