0

こんにちは、特定のタイプのスプレッドシートを読み取り、そのデータからベクトルを動的に作成し、そのベクトルをワークスペースに返す関数を作成しようとしています。

私のxlcsは行で構成されています.最初の行にはベクトルの名前になる文字列があり、残りの行にはベクトルを構成する数字が含まれています.

これが私のコードです:

function [ B ] = read_excel(filename)
%read_excel a function to read time series data from spreadsheet

% I get the contents of the first cell to know what to name the vector
[nr, name]=xlsread(filename, 'sheet1','A2:A2');

% Transform it to a string
name_str = char(name);

% Create a filename from it
varname=genvarname(name_str);

% Get the numbers which will make up the vector
A=xlsread(filename,'B2:CT2');

% Create the vector with the corect name and data
eval([varname '= A;']);

end

私が知る限り、ベクトルは正しく作成されていますが、ワークスペースに戻す方法がわかりません。

これは単なるプロトタイプであり、関数がユーザーの選択した nr のベクトルを一度に返すようにしたいので、できれば解決策は不確定な nr のベクトルを返すことができるはずです。

より正確には、ベクトル varname が作成されます。次を追加すると、スクリプトで使用できます。

eval(['plot(',varname,')'])

ベクトルをプロットしますが、私の目的では、スクリプトの実行後も保持するために、ベクトル varname をワークスペースに返す必要があります。

4

3 に答える 3

2

あなたが探していると思いますevalin

evalin('base', [varname '= B;']);

(そのままではうまくいきませんが、読み進めてください)

ただし、使用しないことを強くお勧めします。

多くの場合、エラーが発生しにくく、通常は優れたプラクティスと見なされ、実際、関数の結果が予測可能であることは非常に一般的です。

あらゆる種類の観点から、予測不可能なデータを予測不可能な変数名に割り当てることは言うまでもなく、それ自体のスコープを超えて (つまり、それ自体とは別のワークスペースで) データを操作する関数を持つことは非常に望ましくありません。これは、デバッグや保守が不必要に困難であり、移植性も高くありません。また、この関数を他の関数内で使用することは、関数を知らない人が考えるようなことではありません。

構造のような平滑化を使用しない理由:

function B = read_excel(filename)

    ...

    B.data = xlsread(filename,'B2:CT2');
    B.name = genvarname(name_str);
end

B次に、同じデータ ( ) を含み、他のものを動的に参照するためにも使用できる出力 ( ) と常に同じ名前(つまりB.data) を持ちます。nameA.(B.name)

于 2013-04-09T08:15:28.620 に答える
1

の代替evalinは functionassigninです。よりも強力ではありevalinませんが、必要なことは正確に行います-ワークスペースに変数を割り当てます。

使用法:

assignin('base', 'var', val)
于 2013-04-09T09:30:41.693 に答える
1

これは関数であるため、作成した変数を出力変数に渡す必要があります。事前に出力したい変数の数がわからないため、構造体を介して行うことをお勧めします。したがって、eval行を次のように変更します。

% Create the vector with the correct name and data
eval(['B.' varname '= A;']);

Bこれで、動的に作成された変数名と同じフィールド名で関数を実行した後、ワークスペースに保持される構造体が呼び出されるはずです。たとえば、varnameXであるとします。ワークスペースで としてアクセスできるようになりましたB.X

ただし、このコード設計については非常に慎重に検討する必要があります。変数名を動的に作成することが最善の方法である可能性はほとんどありません。

于 2013-04-09T08:12:17.623 に答える