0

MATLAB でいくつかのファイルを変数に割り当てています。私は少し怠け者で、ちょっとした問題解決の方法を示そうとしているので、これを行うための関数を作成しようとしました関数の本体:

i=0
for i=0:8
    eval(sprintf('C%d=wavread([''C'' num2str(i)]);', i));
    eval(sprintf('Cs%d=wavread([''Cs'' num2str(i)]);', i));
    eval(sprintf('D%d=wavread([''D'' num2str(i)]);', i));
    eval(sprintf('Ef%d=wavread([''Ef'' num2str(i)]);', i));
    eval(sprintf('E%d=wavread([''E'' num2str(i)]);', i));
    eval(sprintf('F%d=wavread([''F'' num2str(i)]);', i));
    eval(sprintf('Fs%d=wavread([''Fs'' num2str(i)]);', i));
    eval(sprintf('G%d=wavread([''G'' num2str(i)]);', i));
    eval(sprintf('Af%d=wavread([''Af'' num2str(i)]);', i));
    eval(sprintf('A%d=wavread([''A'' num2str(i)]);', i));
    eval(sprintf('Bf%d=wavread([''Bf'' num2str(i)]);', i));
    eval(sprintf('B%d=wavread([''B'' num2str(i)]);', i));
    i=i+1
end

i に値を割り当ててループ内でコードを実行するだけでは、すべてが面倒ですが、実際にループとして実行すると、変数を返さずに完了するまで実行されます。

理由はありますか?

ありがとうございます!また、関数が何も返さない理由もわかりました! 愚かな間違い:)

4

2 に答える 2

1

これはeval、独自のワークスペースを生成するためだと思います。そのため、変数が作成されている間、変数はeval呼び出しの最後に失われます。これは、関数内で作成された変数が返されるときに失われる方法と少し似ています。これを「適切な」方法で行い、代わりにセル配列を使用することをお勧めします。

i = 0; % Note: uneccessary line!
for i = 0:8
    C{i + 1} = wavread(['C' num2str(i)]);
    Cs{i + 1} = wavread(['Cs' num2str(i)]);
    D{i + 1} = wavread(['D' num2str(i)]);
    Ef{i + 1} = wavread(['Ef' num2str(i)]);
    E{i + 1} = wavread(['E' num2str(i)]);
    F{i + 1} = wavread(['F' num2str(i)]);
    Fs{i + 1} = wavread(['Fs' num2str(i)]);
    G{i + 1} = wavread(['G' num2str(i)]);
    Af{i + 1} = wavread(['Af' num2str(i)]);
    A{i + 1} = wavread(['A' num2str(i)]);
    Bf{i + 1} = wavread(['Bf' num2str(i)]);
    B{i + 1} = wavread(['B' num2str(i)]);
    i = i+1;  % Note: uneccessary line!
end

編集: 私が言ったことを無視してevalください。以下のダンのコメントを参照してください。それにもかかわらず、セル配列はこれに取り組む適切な方法です。

于 2013-04-27T21:51:28.913 に答える
0

あなたが言ったようにコードが関数の本体である場合、によって生成されたコードはevalその関数にスコープされます。関数が戻るとすぐに、変数は解放されます。jazzbassrob によって投稿されたコードも、関数内にある場合は機能しませんが、間違いなく正しい方法です。関数ではなくスクリプトにしてください。またはさらに良いことに、関数がセル配列を返すようにします。

function [C, Cs, ...] = readWavs()
    for ii = 0:8
        C{ii} = wavread(['C' num2str(ii)]);
        ....
        ii = ii + 1 %NB this line makes no sense! i will increment by 1 anyway because of the for loop. If you want to increment by 2 then you should change the loop to for ii = 0:2:8
    end
end

またはセル配列の構造体:

function wavStruct = readWavs()
    for ii = 0:8
        wavStruct{ii}.C = wavread(['C' num2str(ii)]);
        ...
    end
end

また、 or は予約されているため、matlab の変数名として使用しないことをおi勧めしjます。sqrt(-1)ii

于 2013-04-27T22:43:32.460 に答える