2012-11-30 12 views
4

我有兩個浮點型變量:Matlab的單獨的輸出爲2個變量

x = 0.5; 
y = 1.5; 

我想他們樓:

x = floor(x); 
y = floor(y); 

我能做到在一個單一的命令?這產生了一個錯誤:

[x y] = floor([x y]); 
+0

爲什麼是你「需要」的兩個變量分開嗎? –

+0

沒有什麼特別的...但這是一個普遍的問題,可以應用於另一種用法。不要專注於x,y – dynamic

+0

那麼爲什麼不使用'z = floor([x y])'?它肯定比@ H.Muster的解決方案更快......如果你必須的話,只需在某個點執行'x = z(:,1),y = z(:,2)'。 –

回答

7

你可以寫你自己的包裝用於地板:

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 
0

如果

A = [0.5 1.5] 

那麼你可以做

floor(A) 

這將導致

ans = [0 1] 

她E公司的一個例子:http://www.matlabtutorials.com/functions/floor.html

+0

如果可能的話,我需要結果在單個命令中的x和y var – dynamic

+0

然後答案是否定的。正如Fyre所說,floor()只能接受一個參數,實際上它可以是一個向量,但它會返回一個向量。 –

2

這裏只是添加一個隨機的想法...

建立在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 
+0

這是個好主意! (+1) –

+0

不錯........ – dynamic

+0

@ yes123:它不會很快,至少不會像做矢量化方式那麼快。因此,我建議不要在任何「生產代碼」或性能敏感區域中使用它。 –