单类型和双类型变量如何在 Matlab 中的同一代码副本中工作,就像 C++ 中的模板一样
Posted
技术标签:
【中文标题】单类型和双类型变量如何在 Matlab 中的同一代码副本中工作,就像 C++ 中的模板一样【英文标题】:how single and double type variables work in the same copy of code in Matlab like template in C++ 【发布时间】:2016-05-12 09:08:21 【问题描述】:我正在使用 matlab 编写一个信号处理程序。我知道有两种类型的浮点变量,单和双。考虑到内存使用,我希望我的代码在系统内存不大的情况下只使用单类型变量,而在必要时也可以适应双类型变量,无需进行重大修改(运行前的简单和轻微修改是好的,即我不需要运行时检查技术)。我知道这可以通过 C 中的宏和 C++ 中的模板来完成。我没有找到可以在 matlab 中做到这一点的实用技术。你有这方面的经验吗?
我有一个简单的想法,即定义一个包含“single”或“double”的全局字符串,然后将此字符串传递给代码中调用的任何内存分配方法,以指示我需要什么类型。我觉得这个可行,我只是想知道你们使用的是哪种技术并且被广泛接受。
【问题讨论】:
请注意,您提到的 C 和 C++ 技术仅适用于编译时。如果您正在谈论分发您的软件,并且它会根据运行它的系统而有所不同,那么这需要在运行时决定。这是一个正确性问题 - 如果您不需要double
精度,只需使用 float
。如果您确实需要 double
精度,那么 float
在有限的内存系统上仍然不够好。
那么您是在真的询问有关在 Matlab 中生成代码的问题吗?不是单/双变量?
顺便说一句,“代码”在这种情况下是不可数名词; “代码”是错误的。
@BoBTFish 感谢您的提醒。我理解你提到的区别。我只需要在运行代码之前更改变量类型。比如我提前知道要处理的数据非常大,我想在matlab代码中修改一个“宏”,使代码与单个变量一起工作,以节省内存。我在运行前接受了一个不重要的修改。
***.com/q/17242291/560648 哈哈
【参考方案1】:
我看不出模板在这里有什么帮助。 c++ 模板的类型仍然在编译时确定(std::vector vec ...)。另请注意,除非另有说明,否则 Matlab 默认将所有变量定义为双精度。您基本上需要对代码进行运行时检查。我可以将一种解决方案视为使用具有持久变量的函数。该变量在每次运行时设置一次。当您生成变量时,您必须通过此函数生成您希望作为浮点数的所有变量。不过,这会减慢分配速度,因为您必须调用函数来分配变量。
这个例子在某种程度上是单例模式的实现(但不完全是)。持久变量类型是在第一次使用时设置的,以后不能在程序中更改(假设你没有做任何愚蠢的事情,比如明确地清除变量)。如果性能是一个问题,我建议使用硬编码单,而不是运行时检查或分配函数或类或你能想出的东西。
function c = assignFloat(a,b)
persistent type;
if (isempty(type) & nargin==2)
type = b;
elseif (isempty(type))
type = 'single';
% elseif(nargin==2), error('Do not set twice!') % Optional code, imo unnecessary.
end
if (strcmp(type,'single'))
c = single(a);
return;
end
c = double(a);
end
【讨论】:
感谢您的回答:-) 也许我的问题应该更准确。其实我不需要运行时检查。我想要一种编译时技术,它允许我在每次运行之前“更改”变量类型。 @Hua 嗯,这并不完全准确。如果类型取决于变量的值,并且您在运行代码时检查此变量,则它是运行时检查的。如果它是一个宏,它将在编译时进行检查。然后宏将是变量的别名,并且编辑宏将与(预)编译时检查相同。但是,Matlab 没有宏,因此您必须有一个在运行时检查的开关。另一种方法是拥有一个函数assignFloat
,您每次都对其进行编辑。将值从单更改为双。
你是对的。我猜你的“assignFloat”在某种程度上类似于我在问题帖子中提到的全局字符串。 (实际上可能与您的“持久类型”相同)。如果使用全局字符串,我们还会在运行代码之前编辑/更改字符串。然后内存分配方法会根据字符串传递的参数分配合适的类型内存。
@Hua 除此之外,如果您使用全局字符串,则无法确定它的设置位置。而且您实际上并没有说明如何使用此字符串。全局变量可能会造成很大的损害。如果你做了一些你想做的事情,你应该将代码保留到一个函数或类中,以实现这一点的特定目的。所有代码都应该包含在这个特定的结构中,并且不能从外部修改。如果你不这样做,你迟早会射中自己的脚。
我实际上想在更新中做一个小更新,以便我对运行时检查发表评论。在 c++ 中,实际上也可以分配一个 constexpr
,它实际上是在编译时评估的。这在 Matlab 中也是不可能的。也可以做很多复杂的结构来使这样的事情成为可能,但我想在 c/c++ 中最常见的方法是通过别名。以上是关于单类型和双类型变量如何在 Matlab 中的同一代码副本中工作,就像 C++ 中的模板一样的主要内容,如果未能解决你的问题,请参考以下文章