英文:
Matlab Container.Map behavior vs Dictionary
问题
I had to remove in my existing script, all dictionary structures to container.Map
because I must run my app on old matlab version (<=R2012b)
我不得不在我的现有脚本中删除所有的字典结构,改用container.Map
,因为我必须在旧版本的Matlab上运行我的应用程序(<=R2012b)
I have a call member on an instance like this :
我在一个实例上调用成员,就像这样:
% Declaration of container map
app.MC = containers.Map('KeyType', 'double', 'ValueType', 'any');
% Create first instance of Monte Carlo object with the key -15.
% Monte_Carlo is a class herited from Handle
app.MC(-15) = Monte_Carlo(Nb_Iterations_par_depointage, consigne_depointage_y);
% Call member on Monte_Carlo instance
app.MC(-15).Enregistre_Reference_Dephasage_Secteur(a, b);
当我执行这个操作时,我在最后一行得到以下错误:
执行此操作时,我在最后一行收到以下错误消息
Too many output arguments.
输出参数太多。
But if I replace the declaration by
但是,如果我将声明替换为
% Declaration of container map
app.MC = dictionary;
All works fine.
一切都正常。
I checked the types, and in both cases class(app.MC(-15))
returns 'Monte_Carlo'
我检查了类型,在两种情况下,class(app.MC(-15))
都返回'Monte_Carlo'
If I proceed in 2 times with an intermediate variable which sotres the app.MC(-15)
instance, it works :
如果我分两步进行,使用一个中间变量来存储app.MC(-15)
实例,它可以工作:
% Declaration of container map
app.MC = containers.Map('KeyType', 'double', 'ValueType', 'any');
% Create first instance of Monte Carlo object with the key -15
app.MC(-15) = Monte_Carlo(Nb_Iterations_par_depointage, consigne_depointage_y);
% Intermediate variable in order to call member with container.Map
Z = app.MC(-15);
% Now I can do that, and it works
Z.Enregistre_Reference_Dephasage_Secteur(a, b);
现在我可以这样做,它可以工作
Do you know why I can access to the member of the object directly with dictionary
, and I can't with container.Map
?
你知道为什么我可以直接使用dictionary
访问对象的成员,而不能使用container.Map
吗?
英文:
I had to remove in my existing script, all dictionary structures to container.Map because I must run my app on old matlab version (<=R2012b)
I have a call member on an instance like this :
% Declaration of container map
app.MC = containers.Map('KeyType', 'double', 'ValueType', 'any');
% Create first instance of Monte Carlo object with the key -15.
% Monte_Carlo is a class herited from Handle
app.MC(-15) = Monte_Carlo(Nb_Iterations_par_depointage, consigne_depointage_y);
% Call member on Monte_Carlo instance
app.MC(-15).Enregistre_Reference_Dephasage_Secteur(a, b);
When I execute this, I get the following error on the last line
Too many output arguments.
But if I replace the declaration by
% Declaration of container map
app.MC = dictionary;
All works fine.
I checked the types, and in both cases class(app.MC(-15))
returns 'Monte_Carlo'
If I proceed in 2 times with an intermediate variable which sotres the app.MC(-15)
instance, it works :
% Declaration of container map
app.MC = containers.Map('KeyType', 'double', 'ValueType', 'any');
% Create first instance of Monte Carlo object with the key -15
app.MC(-15) = Monte_Carlo(Nb_Iterations_par_depointage, consigne_depointage_y);
% Intermediate variable in order to call member with container.Map
Z = app.MC(-15);
% Now I can do that, and it works
Z.Enregistre_Reference_Dephasage_Secteur(a, b);
Do you know why I can access to the member of the object directly with dictionary, and I can't with container.Map ?
答案1
得分: 2
这是因为 containers.Map
的实现方式导致的。这是其中许多问题之一,促使他们添加了 dictionary
。你没有做错任何事情。
如果
Z.Enregistre_Reference_Dephasage_Secteur(a, b);
修改了 Z
,那么 Z
必须是一个句柄对象才能正常工作。如果它不是一个句柄对象(该类派生自 handle
),那么在修改后需要将 Z
写回容器,因为你修改的是一个副本:
Z = app.MC(-15);
Z = Z.make_a_change(a, b);
app.MC(-15) = Z;
(但请注意,在你的代码中,Z 要么是一个句柄对象,要么没有被修改,所以这段代码总是正确的。)
英文:
This is simply because of the way that containers.Map
is implemented. It’s one of the many issues with it that prompted them to add dictionary
. You’re not doing anything wrong.
If
Z.Enregistre_Reference_Dephasage_Secteur(a, b);
modifies Z
, then Z
must be a handle object for this to work. If it’s not a handle object (the class is derived from handle
) then you need to write the Z
back into the container after modifying it, because you modified a copy:
Z = app.MC(-15);
Z = Z.make_a_change(a, b);
app.MC(-15) = Z;
(But do note that in your code, Z is either a handle object or it’s not modified, so that code is always correct.)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论