提问人:Yash 提问时间:7/10/2023 更新时间:7/10/2023 访问量:69
如何实现根据指定数组中的整数四舍五入的楼层函数?
How to implement a floor function that rounds according to integers in a specified array?
问:
我想实现一个与地板函数非常相似的函数,但我希望它根据指定的数组对任何数字进行四舍五入,而不是向最接近的整数四舍五入,我想在 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 中的数字进行四舍五入,但不会向上或向下四舍五入,它只是将数字四舍五入。如果我能解决这个问题,我还可以实现一个类似的四舍五入,比如天花板函数。
任何帮助将不胜感激。
谢谢。
答:
如果可以假设每个 中始终有一个有效的选项,那么在“下限”情况下,必须有一些元素低于 中的所有元素,则可以通过插值来实现。Q
A
Q
A
将元素插值到域中,以便将元素插入到具有元素的位置。然后,您可以使用任何正常的舍入运算 (, , ) 来获取 的基本索引,然后使用该索引。A
1:N
Q
N
floor
ceil
round
Q
% 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
插值保留了每个元素中最接近的元素,但将您置于连续正整数的轴上,这使得索引成为可能。Q
A
Q
在上面的示例中替换为 将结果 which 是此示例中舍入方法中此更改的预期结果。floor
ceil
Ai = [-1,3,3,1]
评论
for loop
matlab 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