如何实现根据指定数组中的整数四舍五入的楼层函数?

How to implement a floor function that rounds according to integers in a specified array?

提问人:Yash 提问时间:7/10/2023 更新时间:7/10/2023 访问量:69

问:

我想实现一个与地板函数非常相似的函数,但我希望它根据指定的数组对任何数字进行四舍五入,而不是向最接近的整数四舍五入,我想在 Matlab 中对此进行编码。

例如,我有一组任意数字数组,由下式给出:

A = [-1.1778, 1.3657, 2.9880, -0.5674]。

然后我有第二个整数数组,如下所示:

Q = [-3, -1, 1, 3]。

我想像使用 floor 函数一样处理 A 的每个元素,但它们必须四舍五入为 Q 中给出的整数之一。

因此,A(3) = 2.9880 必须四舍五入为 1,因为它是给定集合 Q 中小于或等于它的最大整数。同样,A(1) = -1.1778 必须四舍五入为 -3。

我最接近的是根据特定集合对数字进行四舍五入,但我无法弄清楚如何具体向下或向上舍入。

我最好的尝试如下所示:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function s_hat = roundSet(num_array, integer_set)
C = zeros(length(integer_set), length(num_array));
s_hat = zeros(1, length(num_array));
    for ii = 1:length(num_array)
    for jj = 1:length(integer_set)
        C(jj, ii) = abs(num_array(ii) - integer_set(jj));
    end
    end
    [~, i] = min(C, [], 1);
    for ii = 1:length(i)
    s_hat(ii) = integer_set(i(ii));
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

代码根据 b 中最接近的元素对 a 中的数字进行四舍五入,但不会向上或向下四舍五入,它只是将数字四舍五入。如果我能解决这个问题,我还可以实现一个类似的四舍五入,比如天花板函数。

任何帮助将不胜感激。

谢谢。

MATLAB 数学 地板 CEIL

评论

0赞 Simon Goater 7/10/2023
您似乎对 Q 的线性搜索感到满意,但随着数组大小的增加,这可能会变得非常慢。对于较大的数组大小,最好对 Q 进行排序并执行二进制搜索。
0赞 Praveen 7/10/2023
看起来 Q 是排序的,所以我会在你的最后一个添加一个条件语句。不过,它并不优雅!for loopmatlab for ii = 1:length(i) s_hat(ii) = integer_set(i(ii)); if(s_hat(ii)>num_array(ii)) s_hat(ii)=integer_set(i(ii-1)); end end

答:

0赞 Wolfie 7/10/2023 #1

如果可以假设每个 中始终有一个有效的选项,那么在“下限”情况下,必须有一些元素低于 中的所有元素,则可以通过插值来实现。QAQA

将元素插值到域中,以便将元素插入到具有元素的位置。然后,您可以使用任何正常的舍入运算 (, , ) 来获取 的基本索引,然后使用该索引。A1:NQNfloorceilroundQ

% Setup
A = [-1.1778, 1.3657, 2.9880, -0.5674];
Q = [-3, -1, 1, 3];

% Interpolate A onto domain 1,2,...,numel(Q)
Qx = 1:numel(Q);
Ai = interp1( Q, Qx, A, 'linear' ); % = [1.911, 3.18, 3.99, 2.22]
% Do some rounding
Ai = floor( Ai ); % = [1,3,3,2] = index within Q 
Ai = Q( Ai );     % = [-3,1,1,-1] = final "rounded" value to elements of Q

插值保留了每个元素中最接近的元素,但将您置于连续正整数的轴上,这使得索引成为可能。QAQ

在上面的示例中替换为 将结果 which 是此示例中舍入方法中此更改的预期结果。floorceilAi = [-1,3,3,1]