当我将它作为循环运行时,MATLAB代码不起作用?

时间:2013-04-27 21:41:43

标签: matlab for-loop eval

我正在为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分配一个值并在循环中运行代码时,所有东西都是笨拙的,但是当我实际将它作为循环运行时,它只会运行完成而不返回任何变量。

任何想法为什么?

谢谢你们!还弄清楚为什么我的功能没有返回任何东西!愚蠢的错误:)

2 个答案:

答案 0 :(得分: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所说的内容,请参阅下面Dan的评论。尽管如此,细胞阵列是解决这个问题的合适方法。

答案 1 :(得分: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

此外,最好不要在{@ 1}}中使用ij作为变量名,因为它们是为sqrt(-1)保留的,因此我使用了ii