2

我在使用matlab的containers.Map时遇到问题。

这是我的问题的一个例子:

当我尝试使用定义为的键单元数组构建 myClass 实例数组的映射时:

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

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

我收到此错误:

Error using containers.Map
Specified value type does not match the type expected for this container.

但是matlab文档说:

mapObj = containers.Map(keySet,valueSet) 构造一个包含一个或多个值以及每个值的唯一键的 Map。

keySet 为地图指定 n 个唯一键的 1×n 数组。如果 n > 1 并且键是字符串,则 keySet 必须是元胞数组。

valueSet :为地图指定 n 个值的任何类的 1×n 数组。valueSet 中的值的数量必须等于 keySet 中的键的数量。

我也尝试指定类类型,但它也引发了一个错误:

containers.Map('KeyType','char', 'ValueType','myClass')
Error using containers.Map
Unsupported ValueType 'myClass' specified.  See documentation for valid value types.

所以我不明白......如果 containers.Map 对任何类都有效,为什么不为 myClass 工作?

4

1 回答 1

8

如果你这样做

help containers.Map

你得到一个部分说

vType 的有效值为字符串:'char', 'double', 'single', 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'int64', 'uint64', 'logical','any'。键类型和值类型参数的顺序并不重要,但都必须提供。

你可以使用:

containers.Map('KeyType','char', 'ValueType','any')

但是,您可能想要的行为是:

myMap = containers.Map(keySet, num2cell(valueSet))

当您输入正确的键时,这将为您提供一个 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);
于 2013-07-16T20:12:32.660 回答