2013-12-08 201 views
1

我正在開發一個MatLab程序,將雙打映射爲雙打。地圖工作正常。然而,當我去從地圖這樣的檢索值:從地圖中檢索值時出錯

number1 = map(i); % i is a double 

它給我的錯誤:

Specified key type does not match the type expected for this container. 

爲什麼給我這個錯誤?請注意,這不是重複的,因爲我遇到的所有其他問題都是關於將信息放入Map中,而不是將其取出。跨網絡的問題也出現這種情況,我還沒有看到一個涉及從地圖上撤回價值的問題。我的完整代碼如下:

C = []; 
D = []; 
E = []; 
F = []; 
G = []; 
H = []; 

numbers = 10; 
powers = 10; 

format longG 

for i = 1:numbers 
    for j = 3:powers 
     C = [C;i^j]; 
     G = [G;i^j]; 
    end 
    C = transpose(C); 
    D = [D;C]; 
    C = []; 
    G = transpose(G); 
    H = [H;G]; 
    G = []; 
end 

    map = containers.Map(D,H) 

[~,b] = unique(D(:,1)); % indices to unique values in first column of D 
D(b,:);     % values at these rows 

for i = D 
    number1 = map(i); 
    for a = D 
     number2 = map(a); 
     if gcd(number1,number2) == 1 
     E = [E;i+a]; 
     end 
    end 
    E = transpose(E); 
    F = [F;E]; 
    E = []; 
end 

回答

3

map的默認密鑰類型是字符串。如果你想使用double,你需要明確地定義它,例如

map = containers.Map('KeyType', 'double', 'ValueType', 'any');  

如下您可以添加值:

map(3) = 4; 
map(5) = 14; 
map(15) = {'fdfd', 'gfgfg'}; 

獲取鍵:

map.keys 

ans = 

    [3] [5] [15] 

一些快速測試,如果密鑰可以是雙打的數組:

>> keyTest = [1,2,3]'; 
>> class(keyTest) 

ans = 

double 

>> map = containers.Map('KeyType', 'double', 'ValueType', 'any'); 
>> map(keyTest) = 4 
Error using containers.Map/subsasgn 
Specified key type does not match the type expected for this container. 
+0

那我怎麼添加值呢? – hichris123

+0

@ hichris123增加了一些例子。 – Marcin

+0

我剛剛意識到,它之前給我這個地圖的輸出,'計數:64 KeyType:double ValueType:double'。這是不是說它已經是一張雙倍的雙重地圖? – hichris123

1

不確定你要做什麼,因爲C和G都相等,所以D和H是相等的,所以地圖會將一個值映射到它自己。我想你正在試圖建立一個數字的所有權力的地圖。嘗試下面的代碼。

numbers = 1:10; 
powers = 3:10; 

my_num_matrix = repmat(numbers', 1, length(powers)); 
my_pow_matrix = repmat(powers, length(numbers), 1); 

my_result_matrix = my_num_matrix .^ my_pow_matrix; 

my_map_values = mat2cell(my_result_matrix, ones(1, length(numbers)), length(powers)); 

power_map = containers.Map(numbers, my_map_values); 

你可以做任何你想要的地圖,其中包括雙打...例如

map = containers.Map({1.5,2.1,3},{[1,2,3],3,[5,2]}); 
map(1.5) 
map(2.1) 
map(3)