首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB中将双输入量化为双输出

MATLAB中将双输入量化为双输出
EN

Stack Overflow用户
提问于 2015-03-27 18:44:40
回答 1查看 1.6K关注 0票数 1

我试图用128级统一量化器对一组双类型样本进行量化,我希望输出也是双类型的。当我尝试使用“量化”matlab时,会出现一个错误:不支持类'double‘的输入。我也试过"uencode“,但它的回答是无稽之谈。我对matlab很陌生,我已经花了好几个小时来研究这个问题。任何帮手都可以。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-27 22:04:59

uencode应该给出整数结果。这就是关键所在。但关键是它假定了一个对称的范围。从-x到+x,其中x是数据集中最大或最小的值。所以,如果你的数据是从0-10,你的结果看起来是无稽之谈,因为它量化的数值范围-10到10。

在任何情况下,您实际上都需要编码值和量化值。我编写了一个简单的函数来完成这个任务。它甚至没有什么帮助说明(实际上只需输入"help ValueQuantizer")。我还使它非常灵活,所以它应该与任何数据大小(假设您有足够的内存)工作,它可以是一个向量,2d数组,3d,4d....etc。

这里有一个例子来说明它是如何工作的。我们的数字是从-0.5到3.5的均匀分布。这表明,与uencode不同,我的函数处理非对称数据,并且它使用负值。

代码语言:javascript
复制
a = 4*rand(2,4,2) - .5
[encoded_vals, quant_values] = ValueQuantizer(a, 3)

产生

代码语言:javascript
复制
a(:,:,1) =
    0.6041    2.1204   -0.0240    3.3390
    2.2188    0.1504    1.4935    0.8615
a(:,:,2) =
    1.8411    2.5051    1.5238    3.0636
    0.3952    0.5204    2.2963    3.3372

encoded_vals(:,:,1) =
     1     4     0     7
     5     0     3     2
encoded_vals(:,:,2) =
     4     5     3     6
     1     1     5     7

quant_values(:,:,1) =
    0.4564    1.8977   -0.0240    3.3390
    2.3781   -0.0240    1.4173    0.9368
quant_values(:,:,2) =
    1.8977    2.3781    1.4173    2.8585
    0.4564    0.4564    2.3781    3.3390

因此,您可以看到它以整数的形式返回编码的值(就像uencode,但没有奇怪的对称假设)。与uencode不同,它只是以双倍形式返回所有内容,而不是转换为uint8 8/16/32。重要的是它还返回量化的值,这正是您想要的。

这是函数

代码语言:javascript
复制
function [encoded_vals, quant_values] = ValueQuantizer(U, N)
% ValueQuantizer uniformly quantizes and encodes the input into N-bits
% it then returns the unsigned integer encoded values and the actual
% quantized values
%
% encoded_vals = ValueQuantizer(U,N) uniformly quantizes and encodes data
% in U. The output range is integer values in the range [0 2^N-1]
%
% [encoded_vals, quant_values] = ValueQuantizer(U, N) uniformly quantizes
% and encodes data in U. encoded_vals range is integer values [0 2^N-1]
% quant_values shows the original data U converted to the quantized level
% representing the number

    if (N<2)
        disp('N is out of range. N must be > 2')
        return;
    end

    quant_values = double(U(:));

    max_val = max(quant_values);
    min_val = min(quant_values);

    %quantizes the data
    quanta_size = (max_val-min_val) / (2^N -1);
    quant_values = (quant_values-min_val) ./ quanta_size;

    %reshapes the data
    quant_values = reshape(quant_values, size(U));
    encoded_vals = round(quant_values);

    %returns the original numbers in their new quantized form
    quant_values = (encoded_vals .* quanta_size) + min_val;
end

据我所知,这应该总是有效的,但我还没有做过广泛的测试,祝你好运

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29308011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档