我有两个浮点变量:
x = 0.5;
y = 1.5;
我愿意让他们大吃一惊:
x = floor(x);
y = floor(y);
我能用一条命令完成吗?这会导致错误:
[x y] = floor([x y]);
function varargout = myFloor(varargin)
for k = 1:nargin
varargout{k} = floor(varargin{k});
end
如果您将x和y作为两个单独的参数提供,则此函数显示所需的行为。
[a, b] = myFloor(x,y)
a =
0
b =
1
[x y]
作为输入(就像您的示例中一样),您可以使用以下函数:function varargout = myFloor(x)
for k = 1:numel(x)
varargout{k} = floor(x(k));
end
那么你就会调用
[a, b] = myFloor([x y])
a =
0
b =
1
在这里补充一个随机想法...
基于H.Muster的解决方案,您可能想要定义一个个性化的deal
函数,它类似于deal
但还将函数应用于每个参数:
function varargout = myDeal(fun, varargin)
if nargin == 2
varargout(1:nargout) = {feval(fun, varargin{1})};
elseif nargin-1 == nargout
for k = 1:nargout
varargout{k} = feval(fun, varargin{k}); end
else
error('Argument count mismatch.');
end
end
>> [x,y,z] = myDeal(@floor, 0.5, 0.6, 2.7)
x =
0
y =
0
z =
2
>> [x,y,z] = myDeal(@sin, pi/6)
x =
4.999999999999999e-01
y =
4.999999999999999e-01
z =
4.999999999999999e-01
>> [a, b] = myDeal(@fix, 10*rand(2), 8*rand(5))
a =
7 2
7 6
b =
5 2 4 1 6
1 4 5 1 1
0 1 7 2 7
3 6 7 6 2
7 2 4 2 1
disperse
不像上面那个函数一样将东西通过函数传递! :) - Rody Oldenhuis不,这是不可能的。
从语法上可以看出,Floor只能接受一个参数。您可以查看下面的参考资料进行验证:
如果
A = [0.5 1.5]
那么你就可以做
floor(A)
这将导致
ans = [0 1]
z = floor([x y])
呢?这肯定比 @H.Muster 的解决方案更快...如果你必须这样做,那么只需在某个时候执行x = z(:,1), y = z(:,2)
。 - Rody Oldenhuisfloor
版本,而不是我在下面发布的包装器来回答 OP 具体要求的问题。 - H.Muster