2016-11-19 12 views
0

未定義の変数を取り、その値を変更して同じ名前で出力できるMATLAB関数を記述したいとします。私は二度の変数をリスト気にしない場合、私はそこに途中を得た:未定義の変数の値を再割り当てするMATLAB関数

function [varargout]=testing(varargin) 
    for i=1:nargin 
     varargout{i}=varargin{i}*2; 
    end 
end 

x=5; 
y=3; 
z=6; 
[x,y,z]=testing(x,y,z); 

しかし、私は二回、変数名を一覧表示する必要はありません。とにかく私は代わりにこのような関数を呼び出すことができますか?

testing(x,y,z); 

inputnameを使用しようとしましたが、動作させる方法を理解できませんでした。

答えて

1

ワークスペース間で値を目立たないように調整することはお勧めできません。また、バグを検出しにくくなり、コードを維持するのが難しくなります。これに対する議論は本質的にミラーarguments against global variablesです。操作したいデータを明示的に制御する方がはるかに信頼性が高くなります。はい、おそらくデータを別々に保存する必要があります。

たとえば、あなたが使用することができstructure:出力

function testcode() 
mydata.a = 1; 
mydata.b = 2; 
mydata.c = 3; 
mydata.d = 4; 

mydata = multiplydata(mydata, 2); 
disp(mydata) 
end 

function [datastruct] = multiplydata(datastruct, n) 
varnames = fieldnames(datastruct); 
for ii = 1:length(varnames) 
    datastruct.(varnames{ii}) = datastruct.(varnames{ii})*n; 
end 
end 

>> testcode 
    a: 2 
    b: 4 
    c: 6 
    d: 8 

これはvarargin/varargoutを使用するよりも、実際に任意の機能的に異なるものではないが、あなたはあなたのコードを書いた場合あなたが最初から構造を利用しているような方法で、追加のアンパックステップ(例えば、x = varargin{1}など)に対処する必要はありません。


何らかの理由で、あなたは絶対に盲目的にあなたの変数を調整しなければならない(再び、しないでくださいこれは、)、あなたはassigninを使用することができ、場合:

function testcode() 
a = 1; 
b = 2; 
c = 3; 
d = 4; 

multiplydata(2, a, b, c, d); 
fprintf('a: %u\nb: %u\nc: %u\nd: %u\n', a, b, c, d) 
end 

function multiplydata(n, varargin) 
for ii = 1:length(varargin) 
    varname = inputname(ii + 1); 
    assignin('caller', varname, varargin{ii}*n) 
end 
end 

返す:

>> testcode 
a: 2 
b: 4 
c: 6 
d: 8 
関連する問題